gpt4 book ai didi

python - 使用 pandas 和 GNU Parallel 将数据并行导入 MySQL

转载 作者:行者123 更新时间:2023-11-30 21:35:21 25 4
gpt4 key购买 nike

我有几千个目录,我想从中将数据导入 MySQL。我创建了一个 python 脚本,它从单个目录读取数据并将其放入数据库。这是数据被发送到数据库的部分:

host = 'localhost'
engine = create_engine('mysql://user:pass@%s/db?charset=utf8' % host)
conn = engine.connect()
trans = conn.begin()
try:
conn.execute('delete from tests where ml="%s"' % ml)
tests.to_sql(con=conn, name='tests', if_exists='append', index=False)
data.to_sql(con=conn, name='data', if_exists='append', index=False)
trans.commit()
print(CGRE + ml + ': OK' + CEND)
except:
trans.rollback()
print(CRED + ml + ': database error!' + CEND)
raise
conn.close()

单线程执行效果很好但太慢了:

parallel -j 1 "[[ -d {} ]] && (cd {} && data_to_db.py) || echo {} >> ~/Data/failed_db" ::: *

现在我要启动几个进程:

parallel -j 8 .........

有时在执行期间我会收到此错误:

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1213, 'Deadlock found when trying to get lock; try restarting transaction')

有没有什么办法可以增加交易的等待时间,或者换个方式解决,因为不并行执行,导入所有数据的时间太长了?

最佳答案

非常感谢@RomanPerekhrest,这是一个有效的 solution来自 MySQL 手册,使用 LOCK/UNLOCK TABLES

engine = create_engine('mysql://user:pass@%s/db?charset=utf8' % host)
conn = engine.connect()
trans = conn.begin()
try:
conn.execute('set autocommit=0')
conn.execute('lock tables tests write, data write')
conn.execute('delete from tests where ml="%s"' % ml)
tests.to_sql(con=conn, name='tests', if_exists='append', index=False)
data.to_sql(con=conn, name='data', if_exists='append', index=False)
trans.commit()
conn.execute('unlock tables')
print(CGRE + ml + ': OK' + CEND)
except:
trans.rollback()
conn.execute('unlock tables')
conn.close()
print(CRED + ml + ': database error!' + CEND)
raise
conn.close()

关于python - 使用 pandas 和 GNU Parallel 将数据并行导入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54172362/

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