pymysql.err.operational错误:2013年使用pymysql和SQLAlchemy

2024-10-01 07:16:50 发布

您现在位置:Python中文网/ 问答频道 /正文

伙计们!希望有人能帮我解决这个问题。在

我通过SQLAlchemy执行一个查询,返回~6kk行(这是历史数据),我需要在python脚本上处理这些行。我有一些函数来读取和处理使用pandas的数据数据帧。这里其功能是:

def consulta_db_cancelamentos(db_con, query):
    engine = create_engine(db_con, pool_recycle=3600)
    con = engine.connect()
    query_result = con.execution_options(stream_results=True).execute(query)
    query_result_list = []
    while True:
        rows = query_result.fetchmany(10000)
        if not rows:
            break
        for row in rows:
            data = row['data'],\
                row['plano'],\
                row['usuario_id'],\
                row['timestamp_cancelamentos'],\
                row['timestamp'],\
                row['status']

            query_result_list.append(data)

        df = pd.DataFrame()
        if df.empty:
            df = pd.DataFrame(query_result_list)
        else:
            df.append(pd.DataFrame(query_result_list))
        df_cor = corrige_cancelamentos_df(df, '2017-01-01', '2017-12-15')

    con.close()

    return df_cor

如您所见,我已经在尝试读取数据并将其处理/存储在10k行块中。当我试图执行整个脚本时,我在函数上遇到了这个错误(我还包括了在main()上引发的错误):

^{pr2}$

我写consulta_db_cancelamentos的方式已经是对SO和SQLAlchemy文档进行搜索的结果。假设我无法访问MySQL服务器管理。在

当我将查询限制为只为一个usuario_id带来结果时,例如(大约50行),它工作得很好。我在MySQL Workbench上执行了相同的查询,持续时间/Fetch为251.998秒/357.541秒


Tags: 脚本dataframedfdbdatasqlalchemyresultquery
2条回答

我遇到了这样的问题。在将stream_results=True放入查询后,我遇到了问题。在

对我来说,参数net_write_timeout引起了麻烦。当stream_results=True并且应用程序没有立即读取从MySQL服务器发送的所有数据,那么在MySQL服务器端,与应用程序的写通信(发送数据包)将被阻止。net_write_timeout似乎是一个参数,它控制MySQL服务器对被阻止的套接字操作的写入允许连接的秒数。在

所以,我将net_write_timeout参数从60(默认值)改为3600,并解决了这个问题。在

解决了在MySQL Server中执行此命令的问题:

set global max_allowed_packet = 67108864;

这个解决方案是在这里提出的Lost connection to MySQL server during query

相关问题 更多 >