【问题标题】:executing django query in same statement在同一条语句中执行 django 查询
【发布时间】:2013-06-17 13:33:05
【问题描述】:

这可能是一个愚蠢的问题。有没有办法在一个execute 语句中执行多个查询?

cursor = conn.cursor()
cursor.execute("Select * from my_tables; show tables;")
result = cursor.fetchall()

【问题讨论】:

  • 不,你不能这样做,cursor.execute(sql, [params]) 它需要一个 sql 语句和参数列表(可选)。也许您正在寻找子查询 (MySQL Subqueries)?
  • 你总是可以像这样执行raw SQL 语句:docs.djangoproject.com/en/dev/topics/db/sql
  • 感谢您的快速回复。我想这样做的原因是因为我正在为课堂目的创建一个 sql 可注入平台。所以 cursore.execute(sql, [params]) 在这方面不起作用。你知道我可以在 python 中执行 sql 注入查询的任何方式吗?
  • @user1817081 你使用的是什么 DB API?
  • @Aya 我正在使用 MySQLDB

标签: python database django connection


【解决方案1】:

看起来CLIENT_MULTI_STATEMENTS 和CLIENT_MULTI_RESULTS 选项在MySQLdb 中默认启用(这很令人不安),所以你可以这样做......

>>> import MySQLdb
>>> conn = MySQLdb.connect(db='test')
>>> cur = conn.cursor()
>>> cur.execute('select * from foo; show tables;')
2L
>>> cur.fetchall()
((1L,), (1L,))
>>> cur.nextset()
1
>>> cur.fetchall()
(('foo',),)

如果您想演示一个对 InnoDB 表进行更改的示例,您必须使用类似...的方式提交事务

>>> cur.execute('select * from foo; insert into foo values (123);')
2L
>>> cur.nextset()
1
>>> conn.commit()
>>> cur.execute('select * from foo')
3L
>>> cur.fetchall()
((1L,), (1L,), (123L,))

查看PEP249 了解所有返回值的含义。

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 2012-12-08
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多