ost*_*ach 7 python mysql sqlalchemy pandas
我有一个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), ...)
Run Code Online (Sandbox Code Playgroud)
但是,当我插入大量数据时,此查询将花费很长时间。
有没有更简单快捷的方法来获取数据库分配给传入数据的ID列的值?
编辑1: 我可以根据下面的user3364098的回答自己分配ID列。但是,我的工作是并行运行的管道的一部分。如果我自己分配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')
Run Code Online (Sandbox Code Playgroud)
您可以自己分配ID:
import pandas as pd
df['ID'] = pd.read_sql_query('select ifnull(max(id),0)+1 from db_table',cnx).iloc[0,0]+range(len(df))
Run Code Online (Sandbox Code Playgroud)
cnx是您的连接,然后上传您的df。
| 归档时间: |
|
| 查看次数: |
2978 次 |
| 最近记录: |