対話的に 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
インスタンスでも使用できます。
Database.get_columns()
(特定のテーブルの場合)Database.get_primary_keys()
(特定のテーブルの場合)Database.get_foreign_keys()
(特定のテーブルの場合)