sqlite轻量级python orm peewee新手指南

peewee是一个轻量级的ORM。使用sqlalchemy内核,纯python编写,轻便。
支持sqlite,mysql,postgresql

事例使用的凡postgresql(只生数据库的总是不同)
运用起来与django的orm感觉十分相像。

安装

pip install peewee

模型

概念模型

from peewee import *


db = PostgresqlDatabase(
    'xxx',
    user='postgres',
    password='xxx',
    host='127.0.0.1',
)

class Person(Model):
    name = CharField()
    birthday = DateField()
    is_relative = BooleanField()

    class Meta:
        database = db


class Pet(Model):
    owner = ForeignKeyField(Person, related_name='pets')
    name = CharField()
    animal_type = CharField()

    class Meta:
        database = db  

执行

db.connect()
db.create_tables([Person, Pet])

封存数据

from datetime import date

# 生成对象并执行save操作
uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15), is_relative=True)
uncle_bob.save() 

# 用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)

# 嗯,grandma没有给姓
grandma.name = 'Grandma L'
grandma.save()

# 现在添加宠物
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')

自我有了一个bob叔叔,一个姓氏L的奶奶,还有一个免是亲朋好友不晓何来之逗逼herb。。。
他们还有宠物。

去记录

herb_mittens.delete_instance()   # 返回值是删除的行数

询问数据

# 取一行数据,使用SelectQuery.get()
grandma = Person.select().where(Person.name == 'Grandma L').get()
print(grandma.birthday)

# 取所有数据
for person in Person.select():
    print(person.name, person.is_relative)

排有具有类型为cat的宠物的所有者名字

query = Pet.select().where(Pet.animal_type == 'cat')
for pet in query:
    print(pet.name, pet.owner.name)

一直调用pet.owner.name可以博得想要的结果,但是由老之询问中尚无查person表,peewee需要每次都询问person信息
会潜移默化性。
为避免这种状况,我们该在询问的时刻一直而查pet和person表,然后以简单只说明执行join

query = Pet.select(Pet, Person).join(Person).where(Pet.animal_type == 'cat')
for pet in query:
    print(pet.name, pet.owner.name)

排有Herb所有的宠物的名, 并按照名字排序

query = Pet.select().join(Person).where(Person.name == 'Herb').order_by(Pet.name)
for pet in query:
    print(pet.name)

依年龄降低序列出名字

for person in Person.select().order_by(Person.birthday.desc()):
    print(person.name, person.birthday)

排有富有人数的个人信息和宠物信息

for person in Person.select():
    print(person.name, person.pets.count(), 'pets')
    for pet in person.pets:
        print('    ', pet.name, pet.animal_type)

旋即和才情况同样,调用person.pets时peewee需要去查询同一不行pet表
依旧来一个join

subquery = Pet.select(fn.COUNT(Pet.id)).where(Pet.owner == Person.id)
query = (Person
         .select(Person, Pet, subquery.alias('pet_count'))
         .join(Pet, JOIN.LEFT_OUTER)
         .order_by(Person.name))

for person in query.aggregate_rows():  # Note the `aggregate_rows()` call.
    print( person.name, person.pet_count, 'pets')
    for pet in person.pets:
        print( '    ', pet.name, pet.animal_type)

基本上规格查询

d1940 = date(1940, 1, 1)
d1960 = date(1960, 1, 1)
query = (Person
         .select()
         .where((Person.birthday < d1940) | (Person.birthday > d1960)))
for person in query:
    print(person.name, person.birthday)

query2 = (Person
         .select()
         .where((Person.birthday > d1940) & (Person.birthday < d1960)))
for person in query2:
        print(person.name, person.birthday)

其他

peewee也支持
group_by()
having()
limit() and offset()

详见Querying

早就发生数据库?

peewee使用pwiz来转模型
譬如已发出Person数据表
python -m pwiz -e postgresql Person > Person_models.py

正文链接http://ludaming.com/posts/python/peewee.html
本身之博客: ludaming.com

网站地图xml地图