优化python代码以实现更快的响应

优化python代码以实现更快的响应,python,mysql-connector-python,Python,Mysql Connector Python,这段代码可以工作,但速度非常慢。我想使用sqlalchemy模块,因为脚本的其余部分使用它而不是mysql。使用sqlalchemy有什么好处吗?或者我应该继续使用这个 for emp_id in mylist: try: connection = mysql.connector.connect(host='x.x.x.x', port='3306', database='xxx', user='root', password='xxx') cursor

这段代码可以工作,但速度非常慢。我想使用sqlalchemy模块,因为脚本的其余部分使用它而不是mysql。使用sqlalchemy有什么好处吗?或者我应该继续使用这个

for emp_id in mylist:
    try:
        connection = mysql.connector.connect(host='x.x.x.x', port='3306', database='xxx', user='root', password='xxx')

        cursor = connection.cursor(prepared=True)
        sql_fetch_blob_query = """SELECT col1, col2, Photo from tbl where ProfileID = %s"""

        cursor.execute(sql_fetch_blob_query, (emp_id, ))
        record = cursor.fetchall()
        for row in record:
            image =  row[2]
            file_name = 'myimages4'+'/'+str(row[0])+ '_' + str(row[1]) + '/' + 'simage' + str(emp_id) + '.jpg'
            write_file(image, file_name)

    except mysql.connector.Error as error :
        connection.rollback()
        print("Failed to read BLOB data from MySQL table {}".format(error))

    finally:
        if(connection.is_connected()):
            cursor.close()
            connection.close()            

您真的需要建立新的mysql连接并在每次迭代中获得游标吗?如果没有,在开始时打开它一次会大大加快代码的速度

connection = mysql.connector.connect(host='x.x.x.x', port='3306', database='xxx', user='root', password='xxx', charset="utf8")
cursor = connection.cursor(prepared=True)

for emp_id in mylist:
    try:
        sql_fetch_blob_query = """SELECT col1, col2, Photo from tbl where ProfileID = %s"""

        cursor.execute(sql_fetch_blob_query, (emp_id, ))
        record = cursor.fetchall()
        for row in record:
            image =  row[2]
            file_name = 'myimages4'+'/'+str(row[0])+ '_' + str(row[1]) + '/' + 'simage' + str(emp_id) + '.jpg'
            write_file(image, file_name)

    except mysql.connector.Error as error :
        connection.rollback()
        print("Failed to read BLOB data from MySQL table {}".format(error))

    finally:
        # ouch ...
        if(connection.is_connected()):
            cursor.close()
            connection.close()   
UPD: 实际上,您甚至不需要对数据库进行N次查询,因为所有数据都可以通过(…,…)中的
whereprofileid
SQL语句在一次查询中获得。看看这段小代码,它解决了一个几乎相同的任务:

transaction_ids = [c['transaction_id'] for c in checkouts]
format_strings = ','.join(['%s'] * len(transaction_ids))
dm_cursor.execute("SELECT ac_transaction_id, status FROM transactions_mapping WHERE ac_transaction_id IN (%s)" % format_strings, tuple(transaction_ids)) 
payments = dm_cursor.fetchall()

请用它来解决您的问题。

在发布问题之前,我已经试过了。但是我犯了这个错误。。。AttributeError:“非类型”对象没有属性“字符集”,您可以尝试将
charset=“utf8”
添加到连接参数吗?我已经更新了代码。charset=“utf-8”工作正常。但utf8没有。谢谢你的帮助。还有其他建议吗?好的,你可以试试
pymysql.connect(…)
,而不是
pymysql.connector.connect(…)
。列表中有成千上万个ID。我需要将“max_allowed_packet”变量更改为“IN”子句,这是不可能的。