コンテンツにスキップ

Python の基本

pgmem パッケージは、pgmem バイナリを同梱したプラットフォーム別の wheel です。実行時の依存はありません。PostgreSQL のドライバはいつも使っているものを入れてください。

ターミナルウィンドウ
pip install pgmem "psycopg[binary]"

Python 3.9 以降が必要です。wheel は Linux と macOS の x86-64 と arm64、Windows の x86-64 向けにあります。それ以外のプラットフォームでは go build ./cmd/pgmem でバイナリをビルドし、PGMEM_BINARY でその場所を指定してください。

  1. プロセスを起動します。 pgmem.start() はバイナリを起動し、テンプレートサーバーが接続を受け付けるまで待ちます。

    import pgmem
    with pgmem.start(database="app") as pg:
    print(pg.template.dsn) # postgres://postgres@127.0.0.1:54321/app?sslmode=disable

    ほかに userpostgres -c の設定を並べる params(例:["log_statement=all"])、サーバーログを標準エラーに流す log=True、バイナリの場所を指定する binary を渡せます。

  2. スキーマを登録します。 pg.template.dsn に対してマイグレーションを流します。マイグレーションツールを参照してください。

  3. シードデータを入れます。 シードデータを参照してください。

  4. 公式ドライバから使います。

    import psycopg
    with psycopg.connect(pg.template.dsn) as conn:
    row = conn.execute("SELECT name FROM users WHERE id = %s", (1,)).fetchone()
from pathlib import Path
with psycopg.connect(pg.template.dsn) as conn:
conn.execute(Path("schema.sql").read_text())

パラメータがなければ、psycopg は 1 つの文字列に書いた複数の文を受け付けます。

with psycopg.connect(pg.template.dsn) as conn:
conn.execute(Path("seed.sql").read_text())

スナップショットとフォークを直接使う

Section titled “スナップショットとフォークを直接使う”
with pgmem.start(database="app") as pg:
migrate(pg.template.dsn)
snap = pg.template.snapshot() # 開いているトランザクションを待つ。既定は 30 秒
with snap.fork() as fork: # 準備済みデータベースの専用の複製
with psycopg.connect(fork.dsn) as conn:
conn.execute("DELETE FROM orders")
with snap.fork() as fork: # こちらには注文が全部残っている
...

snapshot() の前に、テンプレートへの接続はすべてコミットするか閉じてください。次のページの pytest プラグインは、これを全部代わりにやってくれます。