将Pandas数据框上传到MySQL数据库后如何获取列的自动增量值

ost*_*ach 7 python mysql sqlalchemy pandas

我有一个Pandas DataFrame(称为df),我想将其上传到MySql数据库。数据框具有列[ ABC ],数据库中的表具有列[ IDABC ]。数据库中的ID列是自动递增的主键。

我可以使用df.to_sql('table_name', engine)命令将数据帧上传到数据库。但是,这没有给我任何有关数据库分配给传入数据的ID列的值的信息。我获得此信息的唯一方法是使用ABC列的值查询数据库:

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)

hve*_*ung 7

您可以自己分配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。