【问题标题】:How to get autoincrement values for a column after uploading a Pandas dataframe to a MySQL database将 Pandas 数据框上传到 MySQL 数据库后如何获取列的自动增量值
【发布时间】:2015-01-02 10:18:22
【问题描述】:

我有一个 Pandas DataFrame(称为df),我想将其上传到 MySql 数据库。 数据框有列 [A, B, C] 并且数据库中的表有列 [ID, ABC]。数据库中的 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), ...) 

但是,当我插入大量数据时,此查询需要很长时间。

有没有更简单快捷的方法来获取数据库分配给传入数据的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


    【解决方案1】:

    你可以自己分配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))
    

    cnx 是您的连接,然后上传您的 df。

    【讨论】:

    • 如果你的数据库是 SQL Server,使用 isnull 而不是 ifnull w3schools.com/sql/sql_isnull.asp
    • 如果'ID'不是你要插入的列,你可以把上面答案的右半部分赋给一个变量,然后赋给一个pandas列。我在 postgres 上做过: ids = pd.read_sql_query('select COALESCE(max(id),0)+1 from poi', conn).iloc[0,0]+range(len(pois)) # pois['id '] = ids
    • 对于 postgresql: pd.read_sql_query('select COALESCE(max(id), 0)+1 as max_id from table_name' , dbConnection)
    【解决方案2】:
    import pandas as pd
    df['ID'] = pd.read_sql_query('select MAX(ID)+1 from db_table',cnx).iloc[0,0] + range(len(df))
    

    【讨论】:

    • 您能解释一下您的代码是做什么的,以及为什么它可以解决 OP 的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多