対話的に Peewee を使う

Peewee には、Python インタプリタや Jupyter Notebook などから対話的に作業するためのヘルパー関数が含まれています。この例では、以下のシンプルなスキーマを持つ既存の Sqlite データベースがあると仮定します。

CREATE TABLE IF NOT EXISTS "event" (
    "id" INTEGER NOT NULL PRIMARY KEY,
    "key" TEXT NOT NULL,
    "timestamp" DATETIME NOT NULL,
    "metadata" TEXT NOT NULL);

対話型インタプリタセッションからこのデータベースのクエリを試すには、インタプリタを起動し、以下のヘルパー関数をインポートします。

  • peewee.SqliteDatabase - "events.db" を参照するために使用します。

  • playhouse.reflection.generate_models - 既存のデータベースからモデルを生成するために使用します。

  • playhouse.reflection.print_model - モデル定義を表示するために使用します。

  • playhouse.reflection.print_table_sql - テーブルの SQL を表示するために使用します。

ターミナルセッションは次のようになります。

>>> from peewee import SqliteDatabase
>>> from playhouse.reflection import generate_models, print_model, print_table_sql
>>>

generate_models() 関数は、データベースをイントロスペクトし、見つかったすべてのテーブルのモデルクラスを生成します。これは、作業を開始するための便利な方法であり、多くのタイピングを節約できます。この関数は、テーブル名でキーが付けられた辞書を返し、対応する値として生成されたモデルを持ちます。

>>> db = SqliteDatabase('events.db')
>>> models = generate_models(db)
>>> list(models.items())
[('events', <Model: event>)]

>>> globals().update(models)  # Inject models into global namespace.
>>> event
<Model: event>

モデルのフィールドとデータ型を一覧表示するモデル定義を確認するには、print_model() 関数を使用します。

>>> print_model(event)
event
  id AUTO
  key TEXT
  timestamp DATETIME
  metadata TEXT

読みやすい方が良い場合は、イントロスペクトされたモデルの SQL CREATE TABLE を生成することもできます。これは、イントロスペクトされたデータベースの実際のテーブル定義と一致するはずです。

>>> print_table_sql(event)
CREATE TABLE IF NOT EXISTS "event" (
  "id" INTEGER NOT NULL PRIMARY KEY,
  "key" TEXT NOT NULL,
  "timestamp" DATETIME NOT NULL,
  "metadata" TEXT NOT NULL)

これで、作業するテーブルの構造がわかったので、生成された event モデルに対していくつかのクエリを実行できます。

>>> for e in event.select().order_by(event.timestamp).limit(5):
...     print(e.key, e.timestamp)
...
e00 2019-01-01 00:01:00
e01 2019-01-01 00:02:00
e02 2019-01-01 00:03:00
e03 2019-01-01 00:04:00
e04 2019-01-01 00:05:00

>>> event.select(fn.MIN(event.timestamp), fn.MAX(event.timestamp)).scalar(as_tuple=True)
(datetime.datetime(2019, 1, 1, 0, 1), datetime.datetime(2019, 1, 1, 1, 0))

>>> event.select().count()  # Or, len(event)
60

これらの API とその他の同様のリフレクションユーティリティの詳細については、playhouse 拡張機能 ドキュメントの リフレクション セクションを参照してください。

既存のデータベースのモデル定義を含む実際の Python モジュールを生成するには、コマンドライン pwiz ツールを使用できます。簡単な例を次に示します。

$ pwiz -e sqlite events.db > events.py

events.py ファイルは、データベースインスタンス(events.db を参照)と、データベースで見つかったすべてのテーブルのモデル定義を含む、インポート可能なモジュールになります。 pwiz は、インデックスのイントロスペクト、NULL/NOT NULL 制約の適切なフラグの追加など、追加の優れた処理を行います。

このセクションで説明されている API

より低レベルの API は、Database インスタンスでも使用できます。