交互式使用 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
实例上获取