pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序

Posted

技术标签:

【中文标题】pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序【英文标题】:pandas.DataFrame.to_sql - column order of source csv file and destination table 【发布时间】:2022-01-24 03:20:55 【问题描述】:

在 Azure Databricks 内的笔记本中,我使用 pandas.DataFrame.to_sql 将数据从 CSV 文件加载到 Azure SQL 数据库表。 CSV 文件和 SQL 表中的列顺序完全相同。但他们的名字不同。

问题pandas.DataFrame.to_sql 是否仍会将数据正确加载到相应的列?例如,如果 CSV 文件具有列 F_NameL_NameAgeGender - 并且 SQL 表的列(按相同顺序)为 fnamelnameperson_age、@987654331 @,数据是否仍以相同的顺序加载(即CSV文件中的名字列值将转到sql表的第一个名称列,CSV文件的姓氏列值将转到sql表的姓氏列等...)。

备注:csv文件大约有150列,SQL表的列数完全相同。 csv 文件定期从外部源加载,具有相同数量的列以完全相同的顺序,但列名有时非常轻微 column1coluumn_1, .... 等等。所以我们无法控制在他们的列名上(尽管顺序总是相同的名字,姓氏,年龄,......)

代码 sn-p

import pandas as pd
import sqlalchemy as sq
.............

pandasDFrame = pd.read_csv('/dbfs/FileStore/tables/MyFile.csv', header='infer')

pandasDFrame .to_sql(name='mysqlTable', con=engine, if_exists='replace', method='multi', chunksize=1000, index=False,\
dtype='fname': sq.VARCHAR(15),\
     'lname': sq.VARCHAR(15),\                                                                                      
     `person_age`: sq.varchar(3),\
     `sex` : sq.varchar(10))

【问题讨论】:

我想是的,是的。 列名必须匹配源和目标。事实上,你可以自己测试它。你的代码会发生什么? 【参考方案1】:

考虑在将数据框附加到表之前检索目标表列并将其分配给您的数据框:

with engine.begin() as conn:
    result = conn.execute("SELECT TOP 0 * FROM MySQLTable")
    cols = [col for col in result.keys()]

pandasDFrame.columns = cols

pandasDFrame.to_sql(
    name = 'MySQLTable', 
    con = engine, 
    if_exists = 'replace', 
    method = 'multi', 
    chunksize = 1000, 
    index = False,
    dtype = 
        'fname': sq.VARCHAR(15),
        'lname': sq.VARCHAR(15),
        'person_age': sq.varchar(3),
        'sex': sq.varchar(10)
    
)

【讨论】:

以上是关于pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyODBC 的 fast_executemany 加速 pandas.DataFrame.to_sql

pandas DataFrame.to_sql 和 nan 值

Pandas DataFrame.to_sql() 错误 - 在字符串格式化期间并非所有参数都转换

pandas DataFrame.to_sql() 函数 if_exists 参数不起作用