快速开始
本文简要介绍了peewee的主要特性。本指南涵盖:
l Model Definition -模型定义
l Storing data -数据存储
l Retrieving Data -数据检索
备注:
如果你想要一个更形象的例子,那么有一个更详细的教程,使用peewee和flask框架创建一个“twitter”风格的网络应用程序。
我强烈建议您打开一个交互式shell会话并运行代码,这样你会对输入查询更有感觉。
模型定义
模型类,字段实例和模型实例对应数据库概念:
事物 | 对应 |
模型类 | 数据库表 |
字段实例 | 数据库表的列 |
模型实例 | 数据据库表的行 |
当使用peewee开始一个项目,通常最好通过定义一个或者多个模型类开始你的数据模型。
from peewee import *
db = SqliteDatabase('people.db')
class Person(Model):
name = CharField()
birthday = DateField()
is_relative = BooleanField()
class Meta.:
database = db # 这个模型使用"people.db"数据库
备注:
请注意我们命名我们的模型为Persopn而不是People。这个惯例你应该遵守-虽然这张表包含许多people,我们总是使用单数形式命名该类。
有许多字段类型适合储存各种数据类型。peewee处理pythonic值与数据库值之间的转换,所以你可以在您的代码里放心使用python类。
事情会变得更加有趣,当你用外键建立两个模型之间的关系时。这在peewee很容易做到:
class Pet(Model):
owner = ForeignKeyField(Person, related_name='pets')
name = CharField()
animal_type = CharField()
class Meta.:
database = db #这个模型使用"people.db"数据库
现在我们已经有了自己的模型,让我们连接数据库。虽然明确的打开数据库连接不是必须的,但这是一个很好的做法,因为它会立即显示数据库连接的任何错误,而不是稍候执行第一个查询时的任意时间。当你完成了(你的操作)后关闭连接也是很好的做法,例如:一个web应用在接收到请求后会打开连接,在发送了返回结果后会关闭连接。
>>> db.connect()
我们开始通过在数据库内创建表来存储数据。这会创建表包含适当的列,索引,序列和外键限制:
>>> db.create_tables([Person, Pet])
存储数据
让我们开始用一些人来填充数据库。我们将会使用save()和create()方法来添加和更新表的记录。
>>> from datetime import date
>>> uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15), is_relative=True)
>>> uncle_bob.save() # bob现在被存储在数据库内
1
备注:
当我们执行call()时,被修改行的数量会返回。
有也可以通过调用create()方法来添加一个人,它会返回一个类实例:
>>> grandma = Person.create(name='Grandma', birthday=date(1935, 3, 1), is_relative=True)
>>> herb = Person.create(name='Herb', birthday=date(1950, 5, 5), is_relative=False)
想要更新一行,请修改模型实例并调用save()来保存更改。下面我们将要修改Grandma的名字并将修改保存在数据库:
>>> grandma.name = 'Grandma L.'
>>> grandma.save() # 在数据库更新Grandma的名字
1
现在我们已经存储了三个人在数据库里,让我们给他们一些宠物。Grandma不喜欢在家里养动物,所以她一个也没有,但是Herb是一个动物爱好者:
>>> bob_kitty = Pet.create(owner=uncle_bob, name='Kitty', animal_type='cat')
>>> herb_fido = Pet.create(owner=herb, name='Fido', animal_type='dog')
>>> herb_mittens = Pet.create(owner=herb, name='Mittens', animal_type='cat')
>>> herb_mittens_jr = Pet.create(owner=herb, name='Mittens Jr', animal_type='cat')
经过漫长的一生,Mittens生病并且死去。我们需要将它从数据库中删除:
>>>herb_mittens.delete_instance()#它拥有伟大的一生
1
备注:
delete_instance()返回值是数据库删除的行数
Bob叔叔发现太多的动物死在了Herb家,所以他领养了Fido:
>>> herb_fido.owner = uncle_bob
>>> herb_fido.save()
>>> bob_fido = herb_fido #为了更清晰重命名我们的变量
数据检索
我们的数据库真正的实力在于如何让我们通过查询来检索数据。关系数据库非常适合进行临时查询。
获取单条记录
让我们从数据库来检索Grandma的记录。为了从数据库获取单条记录,使用SelectQuery.get():
>>> grandma = Person.select().where(Person.name ==‘Grandma L.’).get()
我们也可以使用等效的简写Model.get():
>>> grandma = Person.get(Person.name ==‘Grandma L.’)
记录列表
让我们列出表内的所有人:
>>> for person in Person.select():
... print person.name, person.is_relative
...
Bob True
Grandma L. True
Herb False
让我们列出所有的猫和他们的主人的名字:
>>> query = Pet.select().where(Pet.animal_type == 'cat')
>>> for pet in query:
... print pet.name, pet.owner.name
...
Kitty Bob
Mittens Jr Herb
上面的查询有一个很大的问题:因为我们访问了pet.owner.name但是我们没有在原始的查询里选择这个值,所以peewee将不得不执行一个额外的查询来检索宠物的主人。这种行为被称为N+1,通常应该被避免。
我们可以通过选择Pet和Person并且添加一个join来避免额外的查询。