互動式使用 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