2017-01-26 12 views
3

ポンドのDataFrameからポストのDBのテーブルにデータを書き込む最速の方法は不思議です。速いパンダのデータフレームをポストグレースに書き込む

import io 
f = io.StringIO() 
pd.DataFrame({'a':[1,2], 'b':[3,4]}).to_csv(f) 
cursor = conn.cursor() 
cursor.execute('create table bbbb (a int, b int);COMMIT; ') 
cursor.copy_from(f, 'bbbb', columns=('a', 'b'), sep=',') 
cursor.execute("select * from bbbb;") 
a = cursor.fetchall() 
print(a) 
cursor.close() 

をしかし、それは空のリスト[]を返します。私は、次の試したほか、私はpandas.to_sqlを試してみたが、いくつかの理由でデータをコピーすることを企業にとり

1)、

2)。

私には2つの質問があります。つまり、Pythonコード(データフレーム)からPostgres DBにデータをコピーする最も速い方法は何ですか?私が試した2番目のアプローチで何が間違っていたのですか?

答えて

5

あなたの2番目のアプローチは非常に速くなければなりません。

  1. fにcsvファイルを書き込んだ後、ファイルの末尾に配置されている:

    はあなたのコードには二つの問題があります。あなたは読書を始める前にあなたの位置を最初に戻す必要があります。

  2. csvファイルを書くとき、あなたはヘッダとインデックスここ

を省略する必要がありますが、あなたの最終的なコードがどのように見えるかです:InternalError::

import io 
f = io.StringIO() 
pd.DataFrame({'a':[1,2], 'b':[3,4]}).to_csv(f, index=False, header=False) # removed header 
f.seek(0) # move position to beginning of file before reading 
cursor = conn.cursor() 
cursor.execute('create table bbbb (a int, b int);COMMIT; ') 
cursor.copy_from(f, 'bbbb', columns=('a', 'b'), sep=',') 
cursor.execute("select * from bbbb;") 
a = cursor.fetchall() 
print(a) 
cursor.close() 
+0

私は、次のエラーコードを受け取る現在のトランザクションは中止され、コマンドはトランザクションブロックの終了まで無視されます - いくつかのSQLエラーorr?のように見えますか? –

+0

あなたは[トランザクション](https://www.postgresql.org/docs/current/static/tutorial-transactions)の真中にいます。 html)にエラーがありました。 'conn.rollback()'と 'conn.begin()'をもう一度実行する必要があります。 – Michael

+0

ありがとう、しかし、まだ。 DataError:最後に予想された列の後の追加データ コンテキスト:COPY bbbb、行1: "0,1,3" –

関連する問題