Peewee 小结 2018-12-11
# 当我们使用外健关系建立模型之间的关系时,事情变得有趣。这对peewee来说很简单:
class Pet(Model):
owner = ForeignkeyField(Person, backref='pets')
name = CharField()
aninal_type = CharField()
class Meta:
database = db # this model uses the "people,.db" database
储存数据:
让我们从一些人的填充数据库开始。我们将使用save()和create()方法添加和更新人们的记录。
from datetime import date
uncle_bob = Person(name='Bob', birthday=date(1992, 8, 29))
uncle_bob.save() # bob is now stored in the database
# Retuen: 1
# !! 调用save(),将返回修改的行数。
george = Person.create(name='George', birthday=date(1994, 8, 18))
lebron = Person.create(name='lebron', birthday=date(1987, 12, 30))
要更新行,请修改模型实例并调用save()以保留更改。 在这里将更改George的名称,然后将更改后的名字保存在数据库中:
george.name = 'George L.'
george.save() # Update george's name in the database.
# Return: 1
# 在数据库中加一些动物🐒
bob_kitty = Pet.create(owner=uncle_bob, name='Kitty', animal_type='cat')
lebron_fido = Pet.create(owner=lebron, name='Fido' animal_type='dog')
lebrom_mittens = Pet.create(owner=lebron, name='Mittens', animal_type='cat')
lebrom_mittens_jr = Pet.create(owner=lebron, name='Mittens_jr', animal_type='cat')
经过长时间的生命,米腾斯病了并且死了。我们需要将它从数据库中删除掉:
lebrom_mittens.delete_intance() # he had a great life
# Returns: 1
注意 :返回值delete_instance()是从数据库中删除的行数。
lebron_fido.owner = uncle_bob
lebron_fido.save()
要从数据库中获取单个记录,请使用select.get():
george = Person.select().where(Person.name == 'george L.').get()
我们也可以使用等效的简写Model.get():
george = Person.get(Person.name == 'George L.')
让我们列出数据库中所有的人:
fro Person in Person.select():
prints(person.name)
# prints:
#Bob
#george L.
#Herb
让我们列出所有猫及其主人的名字:
query = Pet.select().where(Pet.animal_type == 'cat')
for pet in query:
print(pet.name, pet.owner.name)
# prints:
# kitty Bob
# Mittens Jr lebron
query = (Pet
.selcet(Pet, Person)
.join(Pet.animal_type == 'cat'))
for pet in query:
print(pet.name, pet.owner.name)
# prints:
#Kitty Bob
#Mittens Jr lebron
让我们得到鲍勃拥有的所有宠物:
for pet in pet .select().join(person).where(person.name == 'Bob'):
print(pet.name)
# prints:
# kitty
# fido
我们可以在这里做另一件很酷的事情来获得鲍勃的宠物。由于我们已经有了一个代表鲍勃的对象,我们可以这样做:
for pet in Pet.select().where(Pet.owner == uncle_bob):
print(pet.name)
排序:让我们添加一个order_by()子句确保按字母对它们进行排序:
for pet in Pet.select().where(Pet.owner == uncle_bob).order_by(Pet.name):
print(pet.name)
# prints:
# Fido
# kitty
我们现在列出所有人, 最年轻到最老的人:
for person in Person.select().order_by(Person.birthday.desc()):
print(person.name, person.birthday)
# prints:
# george 1994-08-18
# Bob 1992-08-29
# lebron 1987-12-30
最后一个问题。使用SQL函数查找名称以大小或者写G开头的所有人:
expression = fn.Lower(fn.Substr(person.name, 1, 1)) == 'g'
fro person in person.select().where(expression):
print(person.name)
# prints:
# george L.