【发布时间】:2015-01-02 10:18:22
【问题描述】:
我有一个 Pandas DataFrame(称为df),我想将其上传到 MySql 数据库。
数据框有列 [A, B, C] 并且数据库中的表有列 [ID, A、B、C]。数据库中的 ID 列是自增主键。
我可以使用df.to_sql('table_name', engine) 命令将数据帧上传到数据库。但是,这并没有为我提供有关数据库分配给传入数据的 ID 列的值的任何信息。我获得此信息的唯一方法是使用列 A、B、C 的值查询数据库:
select
ID, A, B, C
from db_table
where (A, B, C) in ((x1, y1, z1), (x2, y2, z2), ...)
但是,当我插入大量数据时,此查询需要很长时间。
有没有更简单快捷的方法来获取数据库分配给传入数据的ID列的值?
编辑 1: 我可以自己分配 ID 列,按照下面 user3364098 的回答。但是,我的工作是并行运行的管道的一部分。如果我自己分配 ID 列,我有可能将相同的 id 值分配给同时上传的不同数据帧。这就是我想将 ID 分配任务委托给数据库的原因。
解决方案: 我最终自己分配了 ID 列,并在上传数据时对表进行了锁定,以保证没有其他进程上传具有相同 id 值的数据。基本上:
try:
engine.execute('lock tables `table_name` write')
max_id_query = 'select max(ID) FROM `table_name`'
max_id = int(pd.read_sql_query(max_id_query, engine).values)
df['ID'] = range(max_id + 1, max_id + len(df) + 1)
df.to_sql('table_name', engine, if_exists='append', index=False)
finally:
engine.execute('unlock tables')
【问题讨论】:
标签: python mysql pandas sqlalchemy