Python MySQLdb没有';不要等待结果

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

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

我已经挖掘了一些关于这个问题的东西,但没有成功

我的问题是这样的:

 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,)]