当前位置:   article > 正文

Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)_peewee 关闭已经开启的事务

peewee 关闭已经开启的事务


01 简介

在使用python开发的过程中,有时需要一些简单的数据库操作,而Peewee正是理想的选择,它是一个小巧而灵活的 Python ORM(对象关系映射)框架,用于简化数据库操作。

本文基于mysql数据库,介绍最基础和常用的用法。

官方文档:
https://docs.peewee-orm.com/en/latest/index.html

GitHub上目前已有10.5k Star:
https://github.com/coleifer/peewee

02 安装

# 安装peewee库
pip install peewee
# 安装mysql数据库客户端
pip install pymysql
  • 1
  • 2
  • 3
  • 4

03 自动创建模型类

假设我有一个名为test的数据库,其中有一张名为user的表,此时可以通过命令自动创建该数据库下各个表的映射模型类:

python -m pwiz -e <db_type> -H <host> -p <port> -u <username> -P <db_name> > model.py
  • 1

其中:

  • db_type:数据库类型,例如mysql
  • host:数据库主机地址
  • port:端口
  • username:数据库连接的用户名
  • db_name:数据库名称

示例:

python -m pwiz -e mysql -H 192.168.0.25 -p 3306 -u root -P test > model.py
  • 1

执行后,会让输入数据库连接密码,而后会在cmd启动的所在目录下生成一个model.py文件。

注意:刚生成的model.py文件编码可能与系统不同,例如我显示是UTF-16LE编码,需要转换为与项目其他.py文件相同的编码。

在这里插入图片描述
在这里插入图片描述

创建好的模型类:

from peewee import *

database = MySQLDatabase('test', **{'charset': 'utf8', 'sql_mode': 'PIPES_AS_CONCAT', 'use_unicode': True,
                                    'host': '...', 'port': 3306, 'user': 'root', 'password': '...'})


class UnknownField(object):
    def __init__(self, *_, **__): pass


class BaseModel(Model):
    class Meta:
        database = database


class User(BaseModel):
    age = IntegerField(null=True)
    email = CharField(null=True)
    name = CharField()

    class Meta:
        table_name = 'user'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这里面的User类对应的就是我数据库中的user表,模型类虽然不显式包含主键字段,但使用user.id可以查看得到。

  • 操作结束后建议关闭连接:
database.close()
  • 1

04 基础使用

4.1 查询

  • 查询所有用户
# 查询所有用户
users = User.select()

# 看看有多少条数据
print(len(users))

# 查看第0条数据
print(users[0])

# 查看所有数据
for user in users:
    print(user)  # 每个user都是User模型对象 这里print会输出主键值
    print(user, user.name, user.age, user.email)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 查询特定属性
users = User.select(User.name, User.age)
for user in users:
    print(user.name, user.age)
  • 1
  • 2
  • 3
  • 条件查询
# 使用where实现条件查询
young_users: ModelSelect = User.select().where(User.age < 35)
for user in young_users:
    print(user, user.name, user.age, user.email)
  • 1
  • 2
  • 3
  • 4
  • 查询单个用户
# 使用get 直接返回一个User对象
user = User.get(User.name == '张三')
print(user.name, user.name)
  • 1
  • 2
  • 3
  • 根据主键查询
# get_by_id()方法
user = User.get_by_id(3)
print(user.name)
  • 1
  • 2
  • 3
  • 多条件、排序、LIMIT
SELECT name FROM `user` WHERE name = '张三' AND email = 'xxx@qq.com' ORDER BY age DESC LIMIT 5;
  • 1

转换为:

query = User.select(User.name)
		.where((User.name == '张三') & (User.email == 'xxx@qq.com'))
        .order_by(User.age.desc())
        .limit(20)
  • 1
  • 2
  • 3
  • 4
  • 子查询示例
SELECT * FROM `user` WHERE id NOT IN (SELECT id FROM user_new);
  • 1

转换:

inner_query = User.select(User.id);
query = User.select().where(User.id.not_in(inner_query))
  • 1
  • 2

4.2 新增

# 会在数据库新增数据 同时也会返回这个新对象
user = User.create(name="王五", age=28, email=None)
print(user.name)
  • 1
  • 2
  • 3

4.3 更新

# 注意最后要加execute()
User.update(email='xxx@qq.com').where(User.name == '王五').execute()
  • 1
  • 2

4.4 删除

# 条件删除
User.delete().where(User.name == '张三').execute()

# 按照id删除 不需要execute()
User.delete_by_id(2)
  • 1
  • 2
  • 3
  • 4
  • 5

更新和删除操作,往往要在最后加execute()

05 事务

使用atomic装饰器实现原子操作:

# 创建数据库连接
database = MySQLDatabase(...)

# 在方法上使用装饰器来保证原子操作 注意这里的()符号不能省略
@database.atomic()
def func():
    User.update(age=20).where(User.name == "张三").execute()
    User.update(age=21).where(User.name == "李四").execute()
   
# 结束后关闭连接
database.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/172879
推荐阅读
相关标签
  

闽ICP备14008679号