Python MySQLdb没有';不要等待结果
我正在尝试运行一些查询,这些查询需要创建一些临时表,然后返回一个结果集,但我无法使用MySQLdb api来实现这一点 我已经挖掘了一些关于这个问题的东西,但没有成功 我的问题是这样的:Python MySQLdb没有';不要等待结果,python,mysql,mysql-python,ipython-notebook,Python,Mysql,Mysql Python,Ipython Notebook,我正在尝试运行一些查询,这些查询需要创建一些临时表,然后返回一个结果集,但我无法使用MySQLdb api来实现这一点 我已经挖掘了一些关于这个问题的东西,但没有成功 我的问题是这样的: create temporary table tmp1 select * from table1; alter tmp1 add index(somefield); create temporary table tmp2 select * from table2; select * from
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客户端并执行显示完整进程列表
,我可以看到我的查询正在执行。它们需要几分钟才能完成。
为什么游标会立即返回,而不是等待查询运行
如果我尝试运行另一个查询,则会出现“命令不同步;您现在无法运行此命令”
我已经尝试将我与自动提交的连接设置为真
db = MySQLdb.connect(host='ip',
user='root',
passwd='pass',
db='mydb',
use_unicode=True
)
db.autocommit(True)
或者将每条语句放入自己的cursor.execute()
和它们之间的db.commit()
,但也没有成功
你能帮我找出问题所在吗?我知道mysql不支持某些操作(如ALTERTABLE)的事务,但为什么api不像使用select
那样等待所有操作完成呢
顺便说一下,我试图在ipython笔记本上执行此操作。我怀疑您正在将多语句SQL字符串直接传递到
游标。执行函数。问题是,每个语句本身就是一个查询,因此不清楚结果集应该包含什么
这里有一个例子来说明我的意思。第一种情况是将一组分号语句传递给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())
输出:
您可以看到没有返回任何内容,即使表中有明确的数据并且使用了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())
输出:
如您所见,我们为每个查询使用了游标的结果,并且最终的查询具有我们期望的结果
我怀疑,即使您发出了多个查询,API也只有执行的第一个查询的句柄,因此在创建表时会立即返回。我建议按照上面第二个示例中的描述序列化查询。提交应该由dbhandle完成,而不是游标。。上面代码中的db.commit()。这就是你试过的吗?是的,是打字错误。当我执行db.commit()
时,会出现不同步错误。是的,你是对的。在您发布正确答案之前,我能够分别执行所有查询。不知怎的,当我以前尝试这一点时,我出现了错误,可能是由于使用了旧的连接。我清除了一切(甚至是mysql连接),我甚至不需要在两者之间进行提交。
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,)]