Peewee 是一个轻量级的 Python ORM(对象关系映射)库,它允许开发者使用 Python 类和对象来与数据库进行交互。在 Peewee 中,Model
是一个核心概念,代表数据库中的一张表,下面详细介绍 Peewee 中 Model
操作的常见方法。
create_table
)该方法用于在数据库中创建与 Model
类对应的物理表。
from peewee import *
# 连接 SQLite 数据库
db = SqliteDatabase('example.db')
# 定义基类模型
class BaseModel(Model):
class Meta:
database = db
# 定义用户模型
class User(BaseModel):
name = CharField()
age = IntegerField()
# 创建表
User.create_table()
解释:create_table
方法会根据 User
模型的定义,在 example.db
数据库中创建一个名为 user
的表。如果表已经存在,默认会抛出异常,可以通过传递 safe=True
参数来避免。
create
)create
方法用于创建并保存一条新的记录到数据库中,返回创建的模型实例。
user = User.create(name='Alice', age=25)
解释:该代码会在 user
表中插入一条新记录,name
为 Alice
,age
为 25,并返回一个 User
实例。
insert_many
)insert_many
方法用于一次性插入多条记录,提高插入效率。
users_data = [
{'name': 'Bob', 'age': 30},
{'name': 'Charlie', 'age': 22}
]
User.insert_many(users_data).execute()
解释:这段代码会将 users_data
列表中的两条记录批量插入到 user
表中。
select
)select
方法用于从数据库中查询记录,返回一个查询对象,可通过迭代获取结果。
all_users = User.select()
for user in all_users:
print(user.name, user.age)
解释:该代码会查询 user
表中的所有记录,并打印出每个用户的姓名和年龄。
where
)where
方法用于添加查询条件,筛选出符合条件的记录。
users_over_25 = User.select().where(User.age > 25)
for user in users_over_25:
print(user.name)
解释:此代码会查询出年龄大于 25 的用户记录,并打印出他们的姓名。
get
)get
方法用于获取满足条件的单条记录,如果未找到会抛出 DoesNotExist
异常。
try:
alice = User.get(User.name == 'Alice')
print(alice.age)
except User.DoesNotExist:
print("未找到名为 Alice 的用户")
解释:代码尝试查询名为 Alice
的用户记录,如果找到则打印其年龄,未找到则捕获异常并输出提示信息。
update
)update
方法用于更新数据库中的记录,可结合 where
方法指定更新的条件。
# 将所有用户的年龄加 1
User.update(age=User.age + 1).execute()
# 将名为 Alice 的用户年龄更新为 26
User.update(age=26).where(User.name == 'Alice').execute()
解释:第一段代码会将 user
表中所有记录的 age
字段值加 1;第二段代码会将名为 Alice
的用户的 age
字段更新为 26。
delete
)delete
方法用于删除数据库中的记录,同样可结合 where
方法指定删除的条件。
# 删除所有年龄小于 20 的用户记录
User.delete().where(User.age < 20).execute()
# 删除名为 Bob 的用户记录
User.delete().where(User.name == 'Bob').execute()
解释:第一段代码会删除 user
表中年龄小于 20 的所有记录;第二段代码会删除名为 Bob
的用户记录。
order_by
)order_by
方法用于对查询结果进行排序,可以按升序(asc()
)或降序(desc()
)排列。
# 按年龄升序排序
users_by_age_asc = User.select().order_by(User.age.asc())
for user in users_by_age_asc:
print(user.name, user.age)
# 按年龄降序排序
users_by_age_desc = User.select().order_by(User.age.desc())
for user in users_by_age_desc:
print(user.name, user.age)
解释:第一段代码会将查询结果按年龄升序排列,第二段代码会按年龄降序排列,并分别打印出用户的姓名和年龄。
paginate
)paginate
方法用于对查询结果进行分页,需要指定页码和每页显示的记录数。
# 获取第 2 页,每页显示 1 条记录
page_2_users = User.select().paginate(2, 1)
for user in page_2_users:
print(user.name)
解释:该代码会获取 user
表中第 2 页的记录,每页显示 1 条,并打印出用户姓名。
count
)count
方法用于统计查询结果的记录数。
total_users = User.select().count()
print(f"用户总数: {total_users}")
解释:代码会统计 user
表中的记录总数并打印出来。
代码如下:
from peewee import *
# 连接 SQLite 数据库
db = SqliteDatabase('example.db')
# 定义基类模型
class BaseModel(Model):
class Meta:
database = db
# 定义用户模型
class User(BaseModel):
id = AutoField()
name = CharField()
age = IntegerField()
email = CharField(null=True)
# 创建表
def create_tables():
with db:
db.create_tables([User])
# 插入示例数据
def insert_sample_data():
users = [
{'name': 'Alice', 'age': 25, 'email': '[email protected]'},
{'name': 'Bob', 'age': 30, 'email': '[email protected]'},
{'name': 'Charlie', 'age': 22, 'email': None},
{'name': 'David', 'age': 25, 'email': '[email protected]'}
]
with db.atomic():
for user in users:
User.create(**user)
# where 条件过滤示例
def where_condition_examples():
# 1. in_ 方法:查询年龄为 25 或 30 的用户
users_in_age = User.select().where(User.age.in_([25, 30]))
print("年龄为 25 或 30 的用户:")
for user in users_in_age:
print(user.name)
# 2. not_in 方法:查询年龄不在 22 和 25 的用户
users_not_in_age = User.select().where(User.age.not_in([22, 25]))
print("\n年龄不在 22 和 25 的用户:")
for user in users_not_in_age:
print(user.name)
# 3. is_null 方法:查询邮箱为 NULL 的用户
users_with_null_email = User.select().where(User.email.is_null(True))
print("\n邮箱为 NULL 的用户:")
for user in users_with_null_email:
print(user.name)
# 4. contains 方法:查询姓名包含 'li' 的用户
users_with_li_in_name = User.select().where(User.name.contains('li'))
print("\n姓名包含 'li' 的用户:")
for user in users_with_li_in_name:
print(user.name)
# 5. startswith 方法:查询姓名以 'A' 开头的用户
users_start_with_a = User.select().where(User.name.startswith('A'))
print("\n姓名以 'A' 开头的用户:")
for user in users_start_with_a:
print(user.name)
# 6. endswith 方法:查询姓名以 'e' 结尾的用户
users_end_with_e = User.select().where(User.name.endswith('e'))
print("\n姓名以 'e' 结尾的用户:")
for user in users_end_with_e:
print(user.name)
# 7. between 方法:查询年龄在 22 到 25 之间的用户
users_between_age = User.select().where(User.age.between(22, 25))
print("\n年龄在 22 到 25 之间的用户:")
for user in users_between_age:
print(user.name)
# 8. regexp 方法:查询姓名符合正则表达式 '^[A-C].*' 的用户(区分大小写)
import re
users_regexp = User.select().where(User.name.regexp('^[A-C].*'))
print("\n姓名以 A - C 开头的用户(区分大小写):")
for user in users_regexp:
print(user.name)
# 9. iregexp 方法:查询姓名符合正则表达式 '^[a-c].*' 的用户(不区分大小写)
users_iregexp = User.select().where(User.name.iregexp('^[a-c].*'))
print("\n姓名以 a - c 开头的用户(不区分大小写):")
for user in users_iregexp:
print(user.name)
# 10. bin_and 方法:这里简单示例,假设 age 作为二进制数处理
users_bin_and = User.select().where((User.age.bin_and(2)) == 2)
print("\nage 的二进制与 2 结果为 2 的用户:")
for user in users_bin_and:
print(user.name)
# 11. bin_or 方法:这里简单示例,假设 age 作为二进制数处理
users_bin_or = User.select().where((User.age.bin_or(2)) == User.age)
print("\nage 的二进制或 2 结果等于自身的用户:")
for user in users_bin_or:
print(user.name)
# 12. concat 方法:假设查询姓名和邮箱拼接后包含 'aliceexample' 的用户
from peewee import fn
users_concat = User.select().where(fn.CONCAT(User.name, User.email).contains('aliceexample'))
print("\n姓名和邮箱拼接后包含 'aliceexample' 的用户:")
for user in users_concat:
print(user.name)
# 13. distinct 方法:查询不同的年龄值
distinct_ages = User.select(User.age).distinct()
print("\n不同的年龄值:")
for age in distinct_ages:
print(age.age)
# 14. collate 方法:使用特定排序规则查询,这里假设 SQLite 支持 'NOCASE' 排序
users_collate = User.select().where(User.name.collate('NOCASE') == 'alice')
print("\n使用 NOCASE 排序规则查询姓名为 'alice' 的用户(不区分大小写):")
for user in users_collate:
print(user.name)
# 15. cast 方法:将年龄字段转换为字符串类型后进行查询
users_cast = User.select().where(fn.CAST(User.age, 'TEXT') == '25')
print("\n将年龄转换为字符串后等于 '25' 的用户:")
for user in users_cast:
print(user.name)
if __name__ == "__main__":
create_tables()
insert_sample_data()
where_condition_examples()
通过以上介绍,我们可以看到 Peewee 和 Peewee_async 为我们提供了丰富的数据库操作能力。Peewee 适用于同步场景,代码简洁易懂;而 Peewee_async 则在异步编程中发挥重要作用,能有效提升程序的性能和并发处理能力。在实际开发中,我们可以根据具体需求选择合适的方式进行数据库操作。希望本文能帮助你更好地掌握 Peewee 和 Peewee_async 的使用。