使用MySQLdb的嵌套查询

时间:2011-01-28 06:56:36

标签: python mysql iterator cursor

我正在尝试使用Python和MySQLdb接口实现以下功能:

  1. 阅读有几百万行的表的内容。
  2. 处理并修改每一行的输出。
  3. 将修改后的行放入另一个表格中。
  4. 对我来说,迭代每一行,即时处理,然后在运行中将每一个新行插入到新表中似乎是明智的。

    这有效:

    import MySQLdb
    import MySQLdb.cursors
    
    conn=MySQLdb.connect(
        host="somehost",user="someuser",
        passwd="somepassword",db="somedb")
    
    cursor1 = conn.cursor(MySQLdb.cursors.Cursor)
    query1 = "SELECT * FROM table1"
    cursor1.execute(query1)
    
    cursor2 = conn.cursor(MySQLdb.cursors.Cursor)
    
    for row in cursor1:
        values = some_function(row)
        query2 = "INSERT INTO table2 VALUES (%s, %s, %s)"
        cursor2.execute(query2, values)
    
    cursor2.close()
    cursor1.close()
    conn.commit()
    conn.close()
    

    但由于它使用客户端游标进行SELECT查询,因此速度慢且占用大量内存。如果我改为使用服务器端游标进行SELECT查询:

    cursor1 = conn.cursor(MySQLdb.cursors.SSCursor)
    

    然后我收到2014年的错误:

    Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method SSCursor.__del__ of <MySQLdb.cursors.SSCursor object at 0x925d6ec>> ignored
    

    因此,在迭代服务器端游标时似乎不喜欢启动另一个游标。这似乎让我陷入了一个非常缓慢的客户端迭代器。

    有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您需要与数据库建立单独的连接,因为第一个连接与流式传输结果集相关,您无法运行插入查询。

试试这个:

import MySQLdb
import MySQLdb.cursors

conn=MySQLdb.connect(
    host="somehost",user="someuser",
    passwd="somepassword",db="somedb")

cursor1 = conn.cursor(MySQLdb.cursors.SSCursor)
query1 = "SELECT * FROM table1"
cursor1.execute(query1)

insertConn=MySQLdb.connect(
    host="somehost",user="someuser",
    passwd="somepassword",db="somedb")
cursor2 = inserConn.cursor(MySQLdb.cursors.Cursor)

for row in cursor1:
    values = some_function(row)
    query2 = "INSERT INTO table2 VALUES (%s, %s, %s)"
    cursor2.execute(query2, values)

cursor2.close()
cursor1.close()
conn.commit()
conn.close()
insertConn.commit()
insertConn.close()