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

更多低级 API 也可在 Database 实例上获取