首页 > 解决方案 > 读取大而复杂的 csv 并插入 SQL Server

问题描述

我正在通过数据框中的 pandas 读取 csv 并希望将其写入 SQL Server:

with pd.read_csv(r"my.csv", sep=";", chunksize=4, usecols=['some', 'columns'...],encoding='cp1252') as reader:
    reader
    for chunk in reader:
        # create db con
        for index, row in chunk.iterrows():
            cursor.execute('INSERT INTO myTable (some, columns ... ) VALUES (?,?...)', row['some'], row['column']...)

适用于简单的 csv 文件,如许多示例中所示。但是对于我更大的文件,我遇到了一些麻烦。特别是对于数据类型和空值。

  1. 数据库中的列是字符串,但 CSV 中的值可以是 int、float、string 或 null。所以我这样做:str(myValue) 使用 int 和 float 但如果有一个空值,我会在我的数据库中得到一个“nan”而不是空值。如果没有str()从 csv 读取数字值,则会出现数据类型错误。
  2. 与表示为 0 和 1 以及 null 的 csv 中的 Bool 值相同。但是'nan' viabool(myBoolValue)被转换为true。没有bool()我得到一个数据类型错误。
  3. 这很慢。使用 pdi (kettle) 我得到约 1800 行/秒的数据库。这里可能只有 100 行/秒。

知道我该如何处理吗?我可以在读取值时定义 DataType 吗?

标签: pythonsql-serverpandascsv

解决方案


有一个名为“df.to_sql”的进程。我认为这有点新。我是几个月前遇到的,我什至不记得在 6 个月前看到过这个。

from fast_to_sql import fast_to_sql as fts
import pyodbc
import pandas as pd
import numpy as np

conn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=your_server_name_here;"
                      "Database=your_database_name_here;"
                      "Trusted_Connection=yes;"
                      )

# build your data frame here...

# df_final.to_sql(table_name, engine, if_exists='replace', index=True)
fts.fast_to_sql(df_final, x, conn, custom=None, if_exists="append", temp=False)
# you can push data to your DB in chunks as well
# chunksize=1000

conn.commit()
conn.close()

在过去的几个月里,我使用它将数据从数百个数据帧传递到 SQL Server 中的数百个表,并且我从未遇到过数据类型和空值的单一问题,如您所描述的。

您可以在此处阅读有关 df.to_sql 的信息。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.to_sql.html


推荐阅读