gpt4 book ai didi

Python MySQLdb 不等待结果

转载 作者:行者123 更新时间:2023-11-29 08:19:03 25 4
gpt4 key购买 nike

我正在尝试运行一些需要创建临时表然后返回结果集的查询,但我无法使用 MySQLdb api 来做到这一点。

我已经挖掘了一些关于这个问题的内容,例如 here但没有成功。

我的查询是这样的:

 create temporary table tmp1
select * from table1;

alter tmp1 add index(somefield);

create temporary table tmp2
select * from table2;

select * from tmp1 inner join tmp2 using(somefield);

这会立即返回一个空结果集。如果我转到 mysql 客户端并执行 show full processlist 我可以看到我的查询正在执行。他们需要几分钟才能完成。为什么游标立即返回而不等待查询运行。

如果我尝试运行另一个查询,我会收到“命令不同步;您现在无法运行此命令”

我已经尝试将自动提交的连接设置为 True

db = MySQLdb.connect(host='ip',
user='root',
passwd='pass',
db='mydb',
use_unicode=True
)
db.autocommit(True)

或者将每个语句放在自己的 cursor.execute() 中并放在它们之间 db.commit() 但也没有成功。

你能帮我找出问题所在吗?我知道 mysql 不支持某些操作(例如 alter table)的事务,但为什么 api 不像 select 那样等到一切都完成?

顺便说一句,我正在尝试在 ipython 笔记本上执行此操作。

最佳答案

我怀疑您将多语句 SQL 字符串直接传递给 cursor.execute 函数。问题是,每个语句本身就是一个查询,因此不清楚结果集应包含什么。

这是一个例子来说明我的意思。第一种情况是将一组分号语句传递给execute,我认为您目前拥有这样的语句。

def query_single_sql(cursor):
print 'query_single_sql'
sql = []
sql.append("""CREATE TEMPORARY TABLE tmp1 (id int)""")
sql.append("""INSERT INTO tmp1 VALUES (1)""")
sql.append("""SELECT * from tmp1""")

cursor.execute(';'.join(sql))
print list(cursor.fetchall())

输出:

query_single_sql
[]

您可以看到,即使表中有明确的数据并且使用了 SELECT,也没有返回任何内容。

第二种情况是每个语句作为独立查询执行,并为每个查询打印结果。

def query_separate_sql(cursor):
print 'query_separate_sql'
sql = []
sql.append("""CREATE TEMPORARY TABLE tmp3 (id int)""")
sql.append("""INSERT INTO tmp3 VALUES (1)""")
sql.append("""SELECT * from tmp3""")
for query in sql:
cursor.execute(query)
print list(cursor.fetchall())

输出:

query_separate_sql
[]
[]
[(1L,)]

如您所见,我们为每个查询消耗了游标的结果,最终查询得到了我们期望的结果。

我怀疑,即使您发出了多个查询,API 也只有执行的第一个查询的句柄,因此在 CREATE TABLE 完成后立即返回。我建议按照上面第二个示例中的描述序列化您的查询。

关于Python MySQLdb 不等待结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com