web-dev-qa-db-ja.com

psycopg2の.sqlスキーマをPython

PostgreSQLスキーマを.sqlファイルに保存しています。それは次のようになります:

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    facebook_id TEXT NOT NULL,
    name TEXT NOT NULL,
    access_token TEXT,
    created INTEGER NOT NULL
);

データベースに接続した後、このスキーマをどのように実行しますか?

私の既存のPythonコードはSQLiteデータベースで機能します:

# Create database connection
self.connection = sqlite3.connect("example.db")

# Run database schema
with self.connection as cursor:
    cursor.executescript(open("schema.sql", "r").read())

しかし、psycopg2のカーソルにはexecutescriptメソッドがありません。それで、どうすればこれを達成できますか?

23
linkyndy

executeを使用するだけです。

with self.connection as cursor:
    cursor.execute(open("schema.sql", "r").read())

ただし、 psycopg2をautocommitモードに最初に設定 して、スクリプト自体のトランザクション管理を使用することもできます。

Psycopg2が、一度にステートメントでファイルを読み取ってDBに送信する、よりスマートなモードを提供していればいいのですが、現在のところ、そのようなモードはありません。 $$クォーティング(およびその$delimiter$バリアント(区切り文字は任意の識別子である可能性があります))、standard_conforming_stringsE''に直面したときに正しく実行するには、かなり堅固なパーサーが必要です文字列、ネストされた関数本体など.

これはでは機能しないことに注意してください

  • psqlバックスラッシュコマンドを含むもの
  • コピー.. STDINから
  • 非常に長い入力

...したがって、pg_dumpからのダンプでは機能しません

52
Craig Ringer

選択した回答のコメントに評判がないため返信できないので、COPYの問題を解決するために回答します。

DBのボリュームに応じて、pg_dump --insertsINSERTsの代わりにCOPYsを出力します

9
Lisael