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

pandas.DataFrame.to_sql - column order of source csv file and destination table

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

问题pandas.DataFrame.to_sql还能正确加载数据到相应的列吗?例如,如果 CSV 文件有列 F_NameL_NameAgeGender - 并且 SQL table 有列(顺序相同) 作为 fnamelnameperson_agesex,数据是否仍会以相同的顺序加载(即,CSV 文件中的名字列值将转到sql table 的名字列,CSV 文件的姓氏列值将转到 sql table 等...的姓氏列。

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

代码片段

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)})

考虑检索目标 table 列并将其分配给您的数据框,然后再将数据框附加到 table:

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)
    }
)