Psycopg にはCOPYを実行するためのカスタム コマンドがあるようです。
psycopg2 COPY を使用して cursor.copy_from() が大きな入力でフリーズする
SQLAlchemy からこの機能にアクセスする方法はありますか?
Psycopg にはCOPYを実行するためのカスタム コマンドがあるようです。
psycopg2 COPY を使用して cursor.copy_from() が大きな入力でフリーズする
SQLAlchemy からこの機能にアクセスする方法はありますか?
受け入れられた答えは正しいですが、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
似てない。
この機能を公開し、ORM 機能を放棄するには、psycopg2 を使用する必要があるかもしれません。とにかく、そのような操作ではORMの利点が実際にはわからないと思います。これは、直接的な一括挿入であり、ORMで個々のオブジェクトを処理することはあまり意味がありません。