使用 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 表:找不到文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Execute many from pyodbc 到 SQL Server 的数据框