一、简介
Peewee是一个轻量级的Python ORM框架,支持MySql,Postgresql,Sqlite等多种关系型数据库,具有优雅的api和简洁的实现方式。它受到Django ORM和SQLAlchemy的启发,可以处理所有的常见数据库操作,并具有高度的扩展性。
Peewee使用模型定义数据结构,同时支持数据表关系建模,使得开发人员可以轻松地进行数据库访问。同时,Peewee支持丰富的查询方式和数据库事务管理,让开发人员可以专注于业务逻辑,而不需要关注过于底层的数据库操作细节。
二、模型定义
在Peewee中,模型是数据结构的抽象,它通常会映射为数据库中的一个表。在定义模型时,通常需要指定以下信息:
1. 数据表名
class Person(Model):
name = CharField()
age = IntegerField()
class Meta:
database = db # db为数据库实例变量
db_table = 'person' # 数据表名为person
2. 字段类型
class User(Model):
username = CharField(unique=True)
age = IntegerField(default=18)
is_admin = BooleanField(null=False, default=False)
regist_time = DateTimeField(default=datetime.now)
Peewee支持多种字段类型,包括CharField,TextField,IntegerField等,可以通过不同的字段类型进行灵活的数据存储。
3. 数据关系
在Peewee中,通过外键实现不同数据表之间的关系。如下面的代码示例中,Blog和Tag两个模型之间通过ManyToManyField建立了多对多的关系:
class Blog(Model):
title = CharField()
content = TextField()
publish_date = DateField()
class Meta:
database = db # db为数据库实例变量
class Tag(Model):
name = CharField()
blogs = ManyToManyField(Blog, backref='tags')
class Meta:
database = db # db为数据库实例变量
三、CRUD操作
Peewee提供了多种简洁清晰的数据库操作方式:
1. 创建
如果需要向数据库中插入数据,可以使用save()方法或create()方法进行创建:
new_person = Person(name='Tom', age=20)
new_person.save()
Person.create(name='Jerry', age=18)
2. 查询
Peewee支持多种查询方式,包括filter(),get()和raw()。其中filter()可以支持多个条件查询,get()可以直接根据主键查询,raw()可以使用原始的SQL查询语句来进行查询。
result = Person.filter(name='Tom', age=20)
result = Person.get(Person.id == 1)
result = Person.raw('SELECT * FROM person WHERE name=\'Tom\';')
3. 更新
如果需要更新数据,可以使用save()方法或update()方法:
person = Person.get(Person.id == 1)
person.name = 'Leo'
person.save()
Person.update(name='Jack').where(Person.age <= 20).execute()
4. 删除
如果需要删除数据,可以使用delete_instance()方法或delete()方法进行删除:
person = Person.get(Person.id == 1)
person.delete_instance()
Person.delete().where(Person.age > 20).execute()
四、高级查询
Peewee支持多种高级查询方式,可以灵活地进行复杂的查询操作:
1. 关联查询
在Peewee中,可以通过join方法进行关联查询。如下面的例子中,通过Blog和Tag两个模型之间的关系建立了一张临时表查询对应的所有数据:
result = Blog.select().join(Tag).where(Tag.name=='Python')
for blog in result:
print(blog.title)
2. 聚合查询
在Peewee中,可以对数据进行聚合计算。如下面的例子,在Person表中求所有人年龄的平均值:
avg_age = Person.select(fn.AVG(Person.age)).scalar()
print(avg_age)
3. 分组查询
在Peewee中,可以通过group_by方法对数据进行分组查询。如下面的例子,在Person表中按照年龄进行分组查询:
query = Person\
.select(Person.age, fn.COUNT(Person.id))\
.group_by(Person.age)\
.order_by(Person.age)
for person in query:
print(person.age, person.count)
五、事务管理
在Peewee中,可以使用transaction()方法进行事务管理操作。在事务的执行中,如果出现异常,会自动回滚事务。
with db.atomic() as txn:
p1 = Person(name='Tom', age=20)
p1.save()
p2 = Person(name='Jerry', age=18)
p2.save()
六、小结
在本篇文章中,我们对Python Peewee ORM框架进行了详细的介绍。Peewee具有简洁的api和灵活的实现方式,支持多种关系型数据库,并且具有优秀的扩展性。通过Peewee,我们可以在Python应用程序中轻松地进行数据库访问,并且进行复杂的查询和事务管理操作。