22

Psycopg にはCOPYを実行するためのカスタム コマンドがあるようです。

psycopg2 COPY を使用して cursor.copy_from() が大きな入力でフリーズする

SQLAlchemy からこの機能にアクセスする方法はありますか?

4

6 に答える 6

36

受け入れられた答えは正しいですが、EoghanMのコメント以上のものを続けたい場合は、テーブルをCSVにコピーする際に次のことがうまくいきました...

from sqlalchemy import sessionmaker, create_engine

eng = create_engine("postgresql://user:pwd@host:5432/db")
ses = sessionmaker(bind=engine)

dbcopy_f = open('/tmp/some_table_copy.csv','wb')

copy_sql = 'COPY some_table TO STDOUT WITH CSV HEADER'

fake_conn = eng.raw_connection()
fake_cur = fake_conn.cursor()
fake_cur.copy_expert(copy_sql, dbcopy_f)

これsessionmakerは必須ではありませんが、エンジンとセッションを同時に作成して使用する習慣がある場合は、raw_connectionそれらを分離する必要があります (セッション オブジェクトを介してエンジンにアクセスする方法がない限り)。わからない)。に提供される sql 文字列copy_expertも唯一の方法ではありません。通常のTO クエリcopy_toに貼り付けることができるパラメーターのサブセットで使用できる基本的な関数があります。COPYコマンドの全体的なパフォーマンスは、私にとっては高速に思え、〜 20000 行のテーブルをコピーします。

http://initd.org/psycopg/docs/cursor.html#cursor.copy_to http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Engine.raw_connection

于 2014-02-27T16:33:52.363 に答える
12

似てない

この機能を公開し、ORM 機能を放棄するには、psycopg2 を使用する必要があるかもしれません。とにかく、そのような操作ではORMの利点が実際にはわからないと思います。これは、直接的な一括挿入であり、ORMで個々のオブジェクトを処理することはあまり意味がありません。

于 2012-10-29T16:10:50.120 に答える