首页 > 解决方案 > 使用 Pandas 一次将多条记录插入 SQL Server

问题描述

我有一个.CSV文件,其中包含以下形式的数据:

2006111024_006919J.20J.919J-25.HLPP.FMGN519.XSVhV7u5SHK3H4gsep.log,2006111024,K0069192,MGN519,DN2BS460SEB0

这就是它在文本文件中的显示方式。在 Excel 中,逗号是列。

.csv文件可以有 100 行这样的行。为了使编码和阅读代码更容易,我将 pandas 与 SQL Alchemy 混合使用。我是 Python 和所有这些模块的新手

我的初始方法获取所有信息,但每次插入一个 csv 文件的每一行。我的导师说这不是最好的方法,我应该使用“批量”插入/读取 csv 的所有行,然后一次将它们全部插入。到目前为止,我的方法使用 pandas df.to_sql。我听说这种方法有一个“多”插入模式。问题是,我不知道如何以我有限的知识使用它,也不知道它如何与我迄今为止的方法一起使用:

def odfsfromcsv_to_db(csvfilename_list, db_instance):
    odfsdict = db_instance['odfs_tester_history']

    for csv in csvfilename_list:  # is there a faster way to compare the list of files in archive and history?
        if csv not in archivefiles_set:
            odfscsv_df = pd.read_csv(csv, header=None, names=['ODFS_LOG_FILENAME', 'ODFS_FILE_CREATE_DATETIME', 'LOT', 'TESTER', 'WF_SCRIBE'])
            #print(odfscsv_df['ODFS_LOG_FILENAME'])
            for index, row in odfscsv_df.iterrows():
                table_row = {
                    "ODFS_LOG_FILENAME": row['ODFS_LOG_FILENAME'],
                    "ODFS_FILE_CREATE_DATETIME": row['ODFS_FILE_CREATE_DATETIME'],
                    "LOT": row['LOT'],
                    "TESTER": row['TESTER'],
                    "WF_SCRIBE": row['WF_SCRIBE'],
                    "CSV_FILENAME": csv.name
                }
               
                print(table_row)
                df1 = pd.DataFrame.from_dict([table_row])
                result = df1.to_sql('odfs_tester_history', con=odfsdict['engine'], if_exists='append', index=False)
                
        else:
            print(csv.name + " is in archive folder already")

如何修改它并能够一次插入多条记录。我觉得仅限于为表的每一行创建一个新字典,然后将该字典插入到表中的每一行。有没有办法将行整理成一个大结构并使用 pandas 将它们一次全部推送到我的数据库中?

标签: pythonsql-serverpython-3.xpandas

解决方案


我通过将数据框直接提供给 sql 找到了自己的答案。这是对@user13802268 答案的轻微修改:

odfscsv_df = pd.read_csv(csv, header=None, names=['ODFS_LOG_FILENAME', 'ODFS_FILE_CREATE_DATETIME', 'LOT', 'TESTER', 'WAFER_SCRIBE'])
result = odfscsv_df.to_sql('odfs_tester_history', con=odfsdict['engine'], if_exists='append', index=False)

推荐阅读