0

我正在尝试运行一些需要创建一些临时表然后返回结果集的查询,但我无法使用 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 客户端做一个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 不像使用 a 那样等到一切都完成select

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

4

1 回答 1

2

我怀疑您将多语句 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 完成后立即返回。我建议按照上面第二个示例中的描述序列化您的查询。

于 2013-11-13T01:00:05.343 回答