使用 pyodbc 批量插入 SQL Server 表:找不到文件

Posted

技术标签:

【中文标题】使用 pyodbc 批量插入 SQL Server 表:找不到文件【英文标题】:BULK INSERT into SQL Server table using pyodbc: cannot find file 【发布时间】:2018-02-13 19:48:33 【问题描述】:

我知道以前有人问过这类问题,但仍然找不到我正在寻找的答案。我正在将 csv 文件批量插入到 SQL Server 表中,但出现如下所示的错误:

我的代码:

df_output.to_csv('new_file_name.csv', sep=',', encoding='utf-8')
conn = pyodbc.connect(r'DRIVER=SQL Server; PORT=1433; SERVER=Dev02; DATABASE=db;UID='';PWD='';')
curr = conn.cursor()
print("Inserting!")
curr.execute("""BULK INSERT STG_CONTACTABILITY_SCORE
               FROM 'C:\\Users\\kdalal\\callerx_project\\caller_x\\new_file_name.csv'
               WITH
               (
                 CODEPAGE = 'ACP',
                 FIRSTROW = 2,
                 FIELDTERMINATOR = ',',
                 ROWTERMINATOR = '\n'
                 );""")
conn.commit()

错误:

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL 服务器驱动程序][SQL Server]无法批量加载,因为文件 "C:\Users\kdalal\callerx_project\caller_x\new_file_name.csv" 不能打开。操作系统错误代码 3(系统无法 找到指定的路径。)。 (4861) (SQLExecDirectW)')

'new_file_name.csv' 在指定路径中。我尝试将路径更改为“new_file_name.csv”,因为它位于我运行脚本的文件夹中,但它仍然会引发

文件不存在

你能告诉我我在这里做错了什么吗?提前非常感谢。

【问题讨论】:

代码文件.py是否在同一个路径? `C:\\Users\\kdalal\\callerx_project\\caller_x\` 是的,在同一个路径 试试df_output.to_csv('C:\\Users\\kdalal\\callerx_project\\caller_x\\new_file_name.csv', sep=',', encoding='utf-8') SQL Server 实例与运行 Python 代码的机器是否位于不同的机器上? @virtualdvid:我会尽快回复你。谢谢。 【参考方案1】:

BULK INSERT 语句在 SQL Server 机器上执行,因此文件路径必须可以从该机器访问。您收到“系统找不到指定的路径”,因为路径

C:\\Users\\kdalal\\callerx_project\\caller_x\\new_file_name.csv

您的机器上的路径,而不是 SQL Server 机器上的路径。

由于您要将数据帧的内容转储到 CSV 文件,您可以简单地使用 df.to_sql 将内容直接推送到 SQL Server,而无需中间的 CSV 文件。为了提高性能,您可以告诉 SQLAlchemy 使用 pyodbc 的 fast_executemany 选项,如相关问题中所述

Speeding up pandas.DataFrame.to_sql with fast_executemany of pyODBC

【讨论】:

知道了。我试过了,它奏效了。表现不错。谢谢。

以上是关于使用 pyodbc 批量插入 SQL Server 表:找不到文件的主要内容,如果未能解决你的问题,请参考以下文章

基本的pyodbc批量插入

使用 Execute many from pyodbc 到 SQL Server 的数据框

pyodbc - 非常慢的批量插入速度

sql server有批量插入和批量更新的sql语句吗

如何在 CrateDB 中使用 python 执行批量插入?

没有名为 sql_server.pyodbc.base 的模块