- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
在 Python 的开发世界中,数据库操作是至关重要的一环.
今天介绍的 Peewee 作为一款简洁且功能强大的 ORM(对象关系映射)框架,为开发者提供了高效便捷的数据库交互方式.
Peewee 是一个简单小巧的 ORM,它的概念简洁明了,易于学习和使用.
能够与 SQLite、MySQL、MariaDB、PostgreSQL 等多种数据库协同工作,拥有丰富的扩展功能,其源代码托管于 GitHub-peewee.
使用过Python的都知道,SQLAlchemy几乎已经是Python中的标准ORM框架了,功能强大, 。
为什么还要使用Peewee呢?
首先,Peewee 设计更为简洁,其 API 简单直观,学习曲线平缓,新手能快速上手,而 SQLAlchemy 相对复杂,需要花费更多时间去掌握.
其次,Peewee 代码量较少,在一些简单项目中,其轻量级的特点能使项目结构更清晰,开发效率更高.
例如在小型数据库应用场景下,Peewee 能快速搭建起数据操作模块.
再者,Peewee 的性能在特定场景下表现出色,如对 SQLite 数据库的操作,其资源占用相对较低,能为应用带来更好的运行效果.
总之,如果项目规模不大,或者做一些小工具,那么Peewee 会更加趁手.
针对不同的数据库类型,有相应的初始化方式.
下面我们选择使用SQLite:
from peewee import SqliteDatabase
db = SqliteDatabase('my_database.db')
在 Peewee 中,通过定义类来创建模型,类的属性对应数据库表中的字段。例如:
from peewee import Model, CharField, IntegerField
class User(Model):
class Meta:
database = db
username = CharField(unique=True)
age = IntegerField()
连接数据库,然后就可通过SqliteDatabase来创建表.
if __name__ == "__main__":
db.connect()
db.create_tables([User])
执行之后,就会发现创建了sqlite数据库和表.
$ sqlite3.exe .\my_database.db
SQLite version 3.45.3 2024-04-15 13:34:05 (UTF-16 console I/O)
Enter ".help" for usage hints.
sqlite> .tables
user
db.create_tables反复执行也没关系,如果表已经存在,不会重复创建.
存储数据时,先创建模型实例并赋值,然后调用 save 方法即可将数据保存到数据库.
if __name__ == "__main__":
user = User(username="Harry", age=23)
user.save()
运行之后,查询数据库,发现数据已经写入了数据库.
sqlite> select * from user;
┌────┬──────────┬─────┐
│ id │ username │ age │
├────┼──────────┼─────┤
│ 1 │ Harry │ 23 │
└────┴──────────┴─────┘
检索数据可以使用各种查询方法。如获取单个记录:
user = User.get(User.username == "Harry")
print(f"name: {user.username}, age: {user.age}")
# 运行结果:
# name: Harry, age: 23
更新记录,比如将上面的年龄改为30.
User.update(age=30).where(User.username == 'Harry').execute()
运行之后:
sqlite> select * from user;
┌────┬──────────┬─────┐
│ id │ username │ age │
├────┼──────────┼─────┤
│ 1 │ Harry │ 30 │
└────┴──────────┴─────┘
删除记录也很简单:
User.delete().where(User.username == 'Harry').execute()
运行之后:
sqlite> select * from user;
sqlite> select count(1) from user;
┌──────────┐
│ count(1) │
├──────────┤
│ 0 │
└──────────┘
高级的查询功能包括多条件过滤,排序以及分页查询等等.
为了演示高级查询功能,先批量插入一批数据.
User.insert_many(users, fields=[User.username, User.age]).execute()
运行结果:
sqlite> select * from user;
┌────┬──────────┬─────┐
│ id │ username │ age │
├────┼──────────┼─────┤
│ 1 │ harry │ 23 │
│ 2 │ lily │ 20 │
│ 3 │ tom │ 35 │
│ 4 │ jerry │ 12 │
│ 5 │ kate │ 42 │
└────┴──────────┴─────┘
多个条件的交集,比如id>2并且age>30的数据:
users = User.select().where((User.id > 2) & (User.age > 30)).execute()
print("满足条件的用户:")
for u in users:
print(f"{u.username}: {u.age}")
运行结果:
$ python.exe .\main.py
满足条件的用户:
tom: 35
kate: 42
多个条件的并集,比如id>4或者age>20的数据:
users = User.select().where((User.id > 4) | (User.age > 20)).execute()
运行结果:
$ python.exe .\main.py
满足条件的用户:
harry: 23
tom: 35
kate: 42
按照年龄增长排序:
users = User.select().order_by(User.age)
运行结果:
$ python.exe .\main.py
按照年龄增长排序:
jerry: 12
lily: 20
harry: 23
tom: 35
kate: 42
按照年龄减少方向排序:
users = User.select().order_by(User.age.desc())
运行结果:
$ python.exe .\main.py
按照年龄减少排序:
kate: 42
tom: 35
harry: 23
lily: 20
jerry: 12
最后,再来看看分页查询,这在前端展示大规模数据时非常有用.
一般的ORM会通过SQL语句中的limit和offset来实现分页查询,而Peewee直接提供了分页查询的API.
page_number = 1 # 页序号,从1开始
page_size = 3 # 每页数据的数量
users = User.select().paginate(page_number, page_size)
print(f"第{page_number}页数据:")
for u in users:
print(f"{u.username}: {u.age}")
运行结果:
$ python.exe .\main.py
第1页数据:
harry: 23
lily: 20
tom: 35
这样就显示了前3个数据,如果把上面的page_numberg=2,那么会返回剩下的2条数据.
Peewee 还拥有众多扩展,如 Playhouse 提供了更多高级功能,包括对不同数据库的特定扩展(如 SQLite 的扩展函数)、模型生成工具、数据库迁移工具、反射功能等,大大增强了 Peewee 的实用性和灵活性.
本篇介绍的是最基本的使用方法,其他还有多表之间关系的建立和查询,请参考官方的文档.
总之,Peewee 以其简洁的语法、丰富的功能和良好的扩展性,成为 Python 开发者在数据库操作方面的有力工具,无论是小型项目还是大型应用,都能提供高效可靠的数据库交互支持.
最后此篇关于Peewee:Python简洁强大的ORM框架的文章就讲到这里了,如果你想了解更多关于Peewee:Python简洁强大的ORM框架的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在用 C# 编写动态语言的解释器,并将原始函数实现为具有虚拟 Apply 方法的抽象类 Primitive,其中每个实际原始函数都是重写 Apply 的子类。 (另一种方法是只拥有类 Primit
我正在用 C# 编写动态语言的解释器,并将原始函数实现为具有虚拟 Apply 方法的抽象类 Primitive,其中每个实际原始函数都是重写 Apply 的子类。 (另一种方法是只拥有类 Primit
我是 Dapper 的新手我正在尝试了解它实际上是如何映射事物的。我有以下数据库结构: calendar | Id | Name | meeting_room | Id | Calendar_id
抱歉问题标题很糟糕。有没有办法在一行中做到这一点: Button button = (Button)Gridview.Cells[0].FindControl("controlname"); butt
在 Java 中在声明点和使用点声明列表/数组文字的tersest方法是什么? 作为次要问题,我更喜欢一种不会导致编译时警告或要求抑制警告的方法。 注意:就我个人而言,这是针对Java 8ish on
什么是现代、简洁、快速的方法来测试节点是否有任何与给定选择器匹配的子节点? “简洁”是指类似于 jQuery 或函数式风格,例如避免循环。我知道本地选择器越来越多地使用这种类型的东西,但没有跟上发展的
getFirstNotNullResult 执行函数列表,直到其中一个函数返回非空值。 如何更优雅/简洁地实现 getNotNullFirstResult? object A { def main
根据 stackoverflow 上某人的推荐,我使用了 jquery succint https://github.com/micjamking/Succinct截断我在 php 网站上的帖子。 它
我是一名优秀的程序员,十分优秀!