我试图使用Python和MySQLdb接口实现以下功能:
。
在我看来,对每一行进行迭代、动态处理,然后将每一行插入到新的动态表中似乎是明智的。
这样做是可行的:
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
因此,它似乎不喜欢在服务器端游标上迭代时启动另一个游标。这似乎给我留下了一个非常慢的客户端迭代器。
有什么建议吗?
发布于 2015-09-08 14:18:16
您需要一个到数据库的单独连接,因为第一个连接被结果集流所卡住,所以无法运行insert查询。
试试这个:
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()
https://stackoverflow.com/questions/4825671
复制