交互使用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 extensions 文件。

要为现有数据库生成包含模型定义的实际python模块,可以使用命令行 pwiz 工具。下面是一个简单的例子:

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

这个 events.py 文件现在将是包含数据库实例的可导入模块(引用 events.db )以及在数据库中找到的任何表的模型定义。 pwiz 做一些额外的好事情,比如自省索引和添加适当的标志 NULL / NOT NULL 约束等。

本节讨论的API:

Database 实例: