python - CSV 到 SQL Server : bulk import nightmare (T-SQL and/or Pandas)

标签 python sql-server pandas bulkinsert pandas-to-sql

我正在尝试将 .CSV 文件批量插入到 SQL Server 中,但没有成功。

一点背景:

1. 我需要将 1600 万条记录插入到 SQL Server (2017) 数据库中。每条记录有 130 列。我在 .CSV 中有一个字段来 self 们的一个供应商的 API 调用,我不允许提及。我有整数、 float 和字符串数据类型。

2. 我尝试了通常的方法:BULK INSERT 但我无法通过数据类型错误。我发布了一个问题 here但无法使其工作。

3. 我尝试使用 python 进行试验,并尝试了我能找到的所有方法,但 pandas.to_sql 对每个人都警告说它非常慢。我遇到了数据类型和字符串截断错误。与 BULK INSERT 中的不同。

4. 在没有太多选择的情况下,我尝试了 pd.to_sql,虽然它没有引发任何数据类型或截断错误,但由于我的空间不足而失败tmp SQL 数据库。尽管我有足够的空间并且我的所有数据文件(和日志文件)都设置为无限制自动增长,但我也无法通过此错误。

我当时就卡住了。我的代码(对于 pd.to_sql 部分)很简单:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mssql+pyodbc://@myDSN")

df.to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)

我不太确定还能尝试什么,欢迎提供任何建议。我见过的所有代码和示例都处理小数据集(列数不多)。我愿意尝试任何其他方法。如有任何指点,我将不胜感激。

谢谢!

最佳答案

我只是想分享这段肮脏的代码,以防它能帮助到其他人。请注意,我非常清楚这根本不是最佳选择,它很慢,但我能够在十分钟内插入大约 1600 万条记录,而不会使我的机器过载。

我试着小批量地做:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mssql+pyodbc://@myDSN")

a = 1
b = 1001

while b <= len(df):
    try:
        df[a:b].to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)
        a = b + 1
        b = b + 1000
    except:
        print(f'Error between {a} and {b}')
        continue

丑得要命但对我有用。

我对所有批评和建议持开放态度。正如我所提到的,我发布这篇文章是为了防止它对其他人有所帮助,同时也期待收到一些建设性的反馈。

关于python - CSV 到 SQL Server : bulk import nightmare (T-SQL and/or Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64415392/

相关文章:

python - 如何拆分列并将它们合并为行?

python - 单列中的 Pandas 天数

python - numpy.ndarray.tofile 在 x 个条目后带有分界线?

sql-server - SQL Server - sys.dm_exec_requests 问题

sql - 每小时分组需要与前一小时数据相加并与 SQL Server 中的另一个字段相减

sql - 如何尝试删除记录而不因错误而终止

python - 在单列上使用 `apply` 加速分组

python - 由于 QueuePool 溢出限制,Flask SqlAlchemy MySQL 连接超时

python - 如何知道有多少个是0级,有多少个是1级?

python - scipy盆地跳跃接受测试: what is f_new and f_old