互動式使用 Peewee
Peewee 包含從 Python 直譯器或類似 Jupyter 筆記本的環境中互動式工作的輔助工具。在此範例中,我們假設有一個預先存在的 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
Database
執行個體上也可以使用更多低階 API