太原网站制作开发,手机端网站开发多少钱,国外wordpress主题优化,鄱阳县精准扶贫旅游网站建设目的文章目录 01 简介02 安装03 自动创建模型类04 基础使用4.1 查询4.2 新增4.3 更新4.4 删除 05 事务 01 简介
在使用python开发的过程中#xff0c;有时需要一些简单的数据库操作#xff0c;而Peewee正是理想的选择#xff0c;它是一个小巧而灵活的 Python ORM#xff08;对… 文章目录 01 简介02 安装03 自动创建模型类04 基础使用4.1 查询4.2 新增4.3 更新4.4 删除 05 事务 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 pymysql03 自动创建模型类
假设我有一个名为test的数据库其中有一张名为user的表此时可以通过命令自动创建该数据库下各个表的映射模型类
python -m pwiz -e db_type -H host -p port -u username -P db_name model.py其中
db_type数据库类型例如mysqlhost数据库主机地址port端口username数据库连接的用户名db_name数据库名称
示例
python -m pwiz -e mysql -H 192.168.0.25 -p 3306 -u root -P test model.py执行后会让输入数据库连接密码而后会在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, *_, **__): passclass BaseModel(Model):class Meta:database databaseclass User(BaseModel):age IntegerField(nullTrue)email CharField(nullTrue)name CharField()class Meta:table_name user这里面的User类对应的就是我数据库中的user表模型类虽然不显式包含主键字段但使用user.id可以查看得到。
操作结束后建议关闭连接
database.close()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)查询特定属性
users User.select(User.name, User.age)
for user in users:print(user.name, user.age)条件查询
# 使用where实现条件查询
young_users: ModelSelect User.select().where(User.age 35)
for user in young_users:print(user, user.name, user.age, user.email)查询单个用户
# 使用get 直接返回一个User对象
user User.get(User.name 张三)
print(user.name, user.name)根据主键查询
# get_by_id()方法
user User.get_by_id(3)
print(user.name)多条件、排序、LIMIT
SELECT name FROM user WHERE name 张三 AND email xxxqq.com ORDER BY age DESC LIMIT 5;转换为
query User.select(User.name).where((User.name 张三) (User.email xxxqq.com)).order_by(User.age.desc()).limit(20)子查询示例
SELECT * FROM user WHERE id NOT IN (SELECT id FROM user_new);转换
inner_query User.select(User.id);
query User.select().where(User.id.not_in(inner_query))4.2 新增
# 会在数据库新增数据 同时也会返回这个新对象
user User.create(name王五, age28, emailNone)
print(user.name)4.3 更新
# 注意最后要加execute()
User.update(emailxxxqq.com).where(User.name 王五).execute()4.4 删除
# 条件删除
User.delete().where(User.name 张三).execute()# 按照id删除 不需要execute()
User.delete_by_id(2)更新和删除操作往往要在最后加execute()。
05 事务
使用atomic装饰器实现原子操作
# 创建数据库连接
database MySQLDatabase(...)# 在方法上使用装饰器来保证原子操作 注意这里的()符号不能省略
database.atomic()
def func():User.update(age20).where(User.name 张三).execute()User.update(age21).where(User.name 李四).execute()# 结束后关闭连接
database.close()