python mysqldb多个连接

Tek*_*mmy 2 python connection mysql-python

嘿伙计们,我有以下问题:1进程执行一个非常大的查询并将结果写入文件,在进程之间应该更新状态到数据库.

首先是:没有问题,伪代码:

db = mysqldb.connect()
cursor = db.cursor()
large = cursor.execute(SELECT * FROM VERYLARGETABLE)
for result in large.fetchall():
     file.write(result)
if timetoUpdateStatus: cursor.execute(UPDATE STATUS)
Run Code Online (Sandbox Code Playgroud)

问题:当获得900万个结果时,"large = cursor.execute(SELECT*FROM VERYLARGETABLE)"永远不会完成......我想出了一个边界,在2列处有4个列,其中mysql服务器在30秒后完成查询但是python进程持续运行数小时...这可能是Python MySQLDB库中的一个错误..

SO SECOND TRY:db.query函数与db.use_results()和fetch_row():

db = mysqldb.connect()
cursor = db.cursor()
db.query(SELECT * FROM VERYLARGETABLE)
large = large.use_result()
while true:
    for row in large.fetch_row(100000):
        file.write(row)
    if timetoUpdateStatus: cursor.execute(UPDATE STATUS) <-- ERROR (2014, "Commands out of sync; you can't run this command now")
Run Code Online (Sandbox Code Playgroud)

所以第三次尝试使用2个MySQL连接...这不起作用,当我打开第二个连接时,第一个连接消失....

有什么建议??

unu*_*tbu 6

尝试使用MySQL SSCursor.它将结果集保存在服务器(MySQL数据结构)中,而不是将结果集传递给客户端(Python数据结构),这是默认光标所做的.使用SSCursor将避免由于默认光标试图构建Python数据结构而导致的长初始延迟 - 并为巨大的结果集分配内存.因此,SSCursor也应该需要更少的内存.

import MySQLdb
import MySQLdb.cursors
import config

cons = [MySQLdb.connect(
    host=config.HOST, user=config.USER,
    passwd=config.PASS, db=config.MYDB,
    cursorclass=MySQLdb.cursors.SSCursor) for i in range(2)]
select_cur, update_cur = [con.cursor() for con in cons]
select_cur.execute(SELECT * FROM VERYLARGETABLE)
for i, row in enumerate(select_cur):
    print(row)
    if i % 100000 == 0 or timetoUpdateStatus:
        update_cur.execute(UPDATE STATUS)
Run Code Online (Sandbox Code Playgroud)

  • 这非常好,但是您需要另一个连接来进行更新查询,因为使用SSCursor需要在执行更多查询之前获取整个结果集. (2认同)