2016-07-05 6 views
2

データベースに接続しています(pyodbcを使用しています)、新しいテーブルにdfをコミットする必要があります。私はこれをSQLでやったことがありますが、dfでそれをやる方法はわかりません。どのようにDFのために働くように、以下のコードを変更する上で任意のアイデア? SQLのためのpyodbcを使ってdfをSQLデータベースにコミットする方法は?

コード:

import pyodbc 
import pandas as pd  

conn= pyodbc.connect(r'DRIVER={Teradata};DBCNAME=foo; UID=name; PWD=password;QUIETMODE=YES;Trusted_Connection=yes') 

cursor = conn.cursor() 
cursor.execute(
""" 
CREATE TABLE SCHEMA.NEW_TABLE AS 
(
SELECT ... FROM .... 
) 
""" 
) 
conn.commit() 

私は、エラーをこのコードを試したが、データベース内に作成していない:

import pyodbc 
import pandas as pd  

conn= pyodbc.connect(r'DRIVER={Teradata};DBCNAME=foo; UID=name; PWD=password;QUIETMODE=YES;Trusted_Connection=yes') 

sheet1.to_sql(con=conn, name='new_table', schema='Schema', if_exists='replace', index=False) 
+1

既に[pandas.DataFrame.to_sql](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html)のドキュメントをご覧になりましたか?それは少なくともアイデアを得るための方法だろうか? Esp。 SQLAlchemyエンジンは私に有望ですが、表面的に見ているかもしれません;-) – Dilettant

+0

この特定のSQL(CREATE TABLE .. AS SELECT ...)について質問しているのであれば、コミットする必要はありませんそれはDDLですから、常に暗黙のコミット(少なくとも私が知っている[Oracle、MySQL、MS SQL]のすべてのRDBMSはこのようにしてください)が必要です。 @Dilettantが既に述べたように、より一般的な解決策は、 'to_sql()'を見てください - それはあなたのためにコミットします。しかし、私はpandasによって正式にサポートされているので、 'pyODBC'の代わりにSQLAlchemyを使用します – MaxU

+0

私は.to_sqlを使用しようとしましたが、おそらくそれを間違って使用しました...ここで私が試したのは: sheet1.to_sql(con = conn、name = 'new_table'、schema = 'スキーマ'、if_exists = 'replace'、index = False) – nonegiven72

答えて

0

to_sql()のマニュアルに明記:

con:SQLAlchemyエンジンまたはDBAPI2接続(レガシーモード)

SQLAlchemyを使用すると、その ライブラリでサポートされているすべてのDBを使用できます。 DBAPI2オブジェクトの場合は、sqlite3のみがサポートされます。

したがって、to_sql()関数にSQLAlchemyエンジンを渡して、PandasからTeradataデータベースに直接書き込む必要があります。

別の方法として、データを別のデータ構造(たとえばto_dict())にダンプし、pyODBCを使用してデータベースでDML文を実行することができます。

関連する問題