【问题标题】:Read big and complex csv and insert in SQL Server读取大而复杂的 csv 并插入 SQL Server
【发布时间】:2021-05-26 07:59:07
【问题描述】:

我正在通过数据框中的 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 一起使用,但如果有 null,我会在我的数据库中得到一个“nan”而不是 null。如果没有str(),当从 csv 读取数值时,我会遇到数据类型错误。
  2. 与 csv 中的 Bool 值相同,表示为 0 和 1 以及 null。但是通过bool(myBoolValue) 的“nan”被转换为true。如果没有bool(),我会收到数据类型错误。
  3. 速度很慢。使用 pdi (kettle) 我得到约 1800 行/秒的数据库。这里可能只有 100 行/秒。

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

【问题讨论】:

  • 在写入数据库之前,pandas 中是否正在进行任何预处理。只是想知道我是否可以在没有熊猫的情况下直接将其丢弃
  • 不,只是分块读取所需的列...

标签: python sql-server pandas csv


【解决方案1】:

有一个名为“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

【讨论】:

  • 已测试...如果我输入 type(chunk) 我得到 到目前为止还可以...但是 fts.fast_to_sql(chunk, 'myTable' , cnxn, custom=None, if_exists="append", temp=False) 创建:pyodbc.ProgrammingError: ('String data, right truncation: length 512 buffer 2', 'HY000')
  • 对我来说都很好。尽管“fts.fast_to_sql”似乎并不比“df.to_sql”快多少。它稍微快了一点,但几乎不引人注意。
  • 我测试了 df.to_sql 效果很好。正确插入的大多数值(即使 null 看起来也不错)。 str 列中的长整数转换为指数,但我在读取 csv 时使用定义的 dtypes 得到了这个。但它很慢......我需要再测试一下。也许我必须带着更多愚蠢的问题回来。但现在:大 THX!
  • 如果对您有帮助,请将我的回答标记为有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多