我使用SQLAlchemy连接将pandas DataFrame写入MySQL数据库。在我的代码的早期,我创建了一个SQLAlchemy引擎:
engine = create_my_sqlalchemy_connection()
我执行一些查询,进行一些计算,然后尝试使用相同的引擎稍后写入数据库:
df.to_sql('my_table', engine, if_exists='append', index=False)
有时这会起作用,有时连接会在代码准备写入数据库时丢失,并且有错误。
我可以尝试一下,除非需要创建一个新连接:
try:
df.to_sql('my_table', engine, if_exists='append', index=False)
except:
engine = create_my_sqlalchemy_connection()
df.to_sql('my_table', engine, if_exists='append', index=False)
然而,我想我会伸出手去看看是否有人知道更好的方法(例如,如果有一些我不知道的SQLAlchemy方法进行测试,看看连接是否仍然存在)。
答案 0 :(得分:2)
您可以使用参数pool_pre_ping
:https://docs.sqlalchemy.org/en/13/core/engines.html#sqlalchemy.create_engine.params.pool_pre_ping
如果为True,则将启用连接池“预ping”功能,该功能可在每次签出时测试连接的活跃性。
只需在创建引擎时通过启用它即可。
答案 1 :(得分:0)
值得尝试Connection.closed属性。
if engine.closed:
engine = create_my_sqlalchemy_connection()
df.to_sql('my_table', engine, if_exists='append', index=False)
else:
df.to_sql('my_table', engine, if_exists='append', index=False)
答案 2 :(得分:0)
如果在将Pandas Dataframe写入SQL Server时遇到超时问题,则您的Dataframe可能很大,或者在插入时数据库必须检查很多约束。
要解决此问题,您需要在Pandas命令中设置chunksize参数:
DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)
块大小:int,可选
行将一次以这种大小批量写入。默认情况下,所有行将被一次写入。
我不知道您有多少行,但是10000可能是一个很好的值。这样做的问题是,如果现在写入失败,您将插入一些行,但不是全部=(并且您将不知道哪一行。
答案 3 :(得分:0)
这对您可能很有用,因为您的连接似乎正在超时。这适用于像我这样认为有用的任何人。
使用MySQL时来自SQLAlchemy文档:
MySQL具有自动关闭连接行为,用于已闲置固定时间段(默认为八个小时)的连接。为了避免出现此问题,请使用create_engine.pool_recycle选项,该选项可确保连接在池中存在固定的秒数后将被丢弃并替换为新的连接:
engine = create_engine('mysql+mysqldb://...', pool_recycle=3600)