gpt4 book ai didi

python - 使用 MySQLdb 的嵌套查询

转载 作者:可可西里 更新时间:2023-11-01 07:08:31 26 4
gpt4 key购买 nike

我正在尝试使用 Python 和 MySQLdb 接口(interface)实现以下目标:

  1. 读取具有几百万行的表的内容。
  2. 处理和修改每一行的输出。
  3. 将修改后的行放到另一个表中。

对我来说,遍历每一行,即时处理,然后即时将每一行插入到新表中似乎是明智的。

这个有效:

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

因此它似乎不喜欢在遍历服务器端游标时启动另一个游标。这似乎让我不得不使用非常慢的客户端迭代器。

有什么建议吗?

最佳答案

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

试试这个:

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()

关于python - 使用 MySQLdb 的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4825671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com