2017-08-15 10 views
4

dataframe.to_sql関数を使用してpandasデータフレームdfをSQL Server DBに挿入しようとしています。しかし、私はエラーの下になって:Pythonでto_sql関数を使用してデータフレームを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') 

エラー:

File "C:\Users\Arvinth\sqlalchemy\engine\default.py", line 470, in do_execute cursor.execute(statement, parameters)

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '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 

誰もが問題を解決する助けてください。

+1

これは必須ではありません* [Tableau]。[dbo]。*に接続しているとき* Tableau *とデフォルトスキーマは* dbo *です。単にテーブル名を渡します: 'df.to_sql(name = 'テストテーブル'、con = engine、index = False、 if_exists = 'append')' – Parfait

+0

うまく動作します。どうもありがとう! –

答えて

3

ようにコメントし、あなたはパンダにためto_sqlコール 『[タブロー]。[DBO]。[テストテーブル]』をデータベース名とテーブルのdboスキーマ引数を参照し、名前を括弧、レンダリングsqlAlchemyエンジンのCREATE TABLE SQL呼び出しでエラーが発生しました。現在の接続であるため、参照されるデータベースとデフォルトのスキーマはdboであり、名前の修飾子は両方とも必要ではありません。 `'[Tableau]。[dbo]。 'よって

df.to_sqlに、単にブラケットエスケープせずにテーブル名を参照:

接続 Tableauデータベースのデフォルト dboスキーマに必要なテーブルを作成する
df.to_sql(name='Test table', con=engine, index=False, if_exists='append') 

CREATE TABLE [Test table] (
    [A] INTEGER NULL, 
    [B] INTEGER NULL, 
    [C] INTEGER NULL 
); 
-2

多分to_sql()の表を参照することができます:

df.to_sql('test_table',con=engine, index=False, if_exists='append') 
+1

これは受け入れられた回答にも記載されています。同じ問題に対して別の解決策がある場合にのみ、新しい回答を追加してください。 – rene

関連する問題