5

我正在尝试使用 dataframe.to_sql 函数将 pandas 数据帧 df 插入 SQL Server DB。但我得到以下错误:

源代码:

import pyodbc
import sqlalchemy
import urllib

df  #sample dataframe
params = urllib.parse.quote_plus("DRIVER={SQL Server};SERVER=GIRSQL.GIRCAPITAL.com;DATABASE=Tableau;UID=SQL_User;PWD=pass")
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
engine.connect()
df.to_sql(name='[Tableau].[dbo].[Test table]',con=engine, index=False, 
if_exists='append')

错误:

文件“C:\Users\Arvinth\sqlalchemy\engine\default.py”,第 470 行,在 do_execute cursor.execute(语句,参数)

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]'INTEGER' 附近的语法不正确。(102) (SQLExecDirectW)") [SQL : '\nCREATE TABLE [[Tableau].[dbo].[Test table]] (\n\t[A] INTEGER NULL, \n\t[B] INTEGER NULL, \n\t[C] INTEGER NULL\ n)\n\n']

示例数据框:

    A  B  C
 0  0  0  0
 1  1  1  1
 2  2  2  2
 3  3  3  3
 4  4  4  4
 5  5  5  5
 6  6  6  6
 7  7  7  7

任何人都可以请帮助解决这个问题。

4

2 回答 2

6

如评论所述,您在 pandas对'[Tableau].[dbo].[Test table]'dbo的调用中引用了表arg的数据库名称和架构,并将名称括起来,从而在 sqlAlchemy 引擎的SQL 调用中呈现错误。由于当前连接引用的数据库并且默认架构是,因此不需要 name 中的两个限定符:`'[Tableau].[dbo]。'to_sqlCREATE TABLEdbo

因此,在 中df.to_sql,只需引用没有括号转义的表名:

df.to_sql(name='Test table', con=engine, index=False, if_exists='append')

dbo这将在连接Tableau数据库的默认模式中创建所需的表:

CREATE TABLE [Test table] (
    [A] INTEGER NULL,
    [B] INTEGER NULL, 
    [C] INTEGER NULL
);
于 2017-08-15T18:12:28.610 回答
-2

Maybe you can refer the table in to_sql():

df.to_sql('test_table',con=engine, index=False, if_exists='append')
于 2017-09-29T07:06:09.890 回答