Python+Peewee 中 Model 操作的常见方法

Peewee 是一个轻量级的 Python ORM(对象关系映射)库,它允许开发者使用 Python 类和对象来与数据库进行交互。在 Peewee 中,Model 是一个核心概念,代表数据库中的一张表,下面详细介绍 Peewee 中 Model 操作的常见方法。

1. 创建表(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 参数来避免。

2. 插入数据

2.1 插入单条数据(create

create 方法用于创建并保存一条新的记录到数据库中,返回创建的模型实例。

user = User.create(name='Alice', age=25)

解释:该代码会在 user 表中插入一条新记录,name 为 Aliceage 为 25,并返回一个 User 实例。

2.2 批量插入数据(insert_many

insert_many 方法用于一次性插入多条记录,提高插入效率。

users_data = [
    {'name': 'Bob', 'age': 30},
    {'name': 'Charlie', 'age': 22}
]
User.insert_many(users_data).execute()

解释:这段代码会将 users_data 列表中的两条记录批量插入到 user 表中。

3. 查询数据

3.1 查询所有记录(select

select 方法用于从数据库中查询记录,返回一个查询对象,可通过迭代获取结果。

all_users = User.select()
for user in all_users:
    print(user.name, user.age)

解释:该代码会查询 user 表中的所有记录,并打印出每个用户的姓名和年龄。

3.2 根据条件查询(where

where 方法用于添加查询条件,筛选出符合条件的记录。

users_over_25 = User.select().where(User.age > 25)
for user in users_over_25:
    print(user.name)

解释:此代码会查询出年龄大于 25 的用户记录,并打印出他们的姓名。

3.3 查询单条记录(get

get 方法用于获取满足条件的单条记录,如果未找到会抛出 DoesNotExist 异常。

try:
    alice = User.get(User.name == 'Alice')
    print(alice.age)
except User.DoesNotExist:
    print("未找到名为 Alice 的用户")

解释:代码尝试查询名为 Alice 的用户记录,如果找到则打印其年龄,未找到则捕获异常并输出提示信息。

4. 更新数据(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。

5. 删除数据(delete

delete 方法用于删除数据库中的记录,同样可结合 where 方法指定删除的条件。

# 删除所有年龄小于 20 的用户记录
User.delete().where(User.age < 20).execute()

# 删除名为 Bob 的用户记录
User.delete().where(User.name == 'Bob').execute()

解释:第一段代码会删除 user 表中年龄小于 20 的所有记录;第二段代码会删除名为 Bob 的用户记录。

6. 排序(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)

解释:第一段代码会将查询结果按年龄升序排列,第二段代码会按年龄降序排列,并分别打印出用户的姓名和年龄。

7. 分页(paginate

paginate 方法用于对查询结果进行分页,需要指定页码和每页显示的记录数。

# 获取第 2 页,每页显示 1 条记录
page_2_users = User.select().paginate(2, 1)
for user in page_2_users:
    print(user.name)

解释:该代码会获取 user 表中第 2 页的记录,每页显示 1 条,并打印出用户姓名。

8. 统计记录数(count

count 方法用于统计查询结果的记录数。

total_users = User.select().count()
print(f"用户总数: {total_users}")

解释:代码会统计 user 表中的记录总数并打印出来。

9.where条件示例代码

代码如下:

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 的使用。

你可能感兴趣的:(python,数据库)