在写 Python 的时候老是拼接 SQL 语句烦不烦?一不小心手抖多打个引号就报错,这谁顶得住啊!今天我要安利一个特别好用的ORM框架- Peewee,它能让你优雅地操作数据库,就像在玩积木一样简单。
1.
啥是 Peewee?
Peewee 是个轻量级的 ORM 框架,把数据库里的表变成 Python 里的类,字段变成类的属性。写代码的时候完全不用管 SQL 语句咋写,框架都帮你搞定了。代码写起来贼简单,性能还不赖。
from peewee import *
db = SqliteDatabase('my_app.db')
class User(Model):
username = CharField(unique=True)
email = CharField()
class Meta:
database = db
2.
增删改查有多爽
查数据超级简单,就跟写 Python 代码一样:
# 查找所有用户
users = User.select()
# 条件查询
active_users = User.select().where(User.active == True)
# 新增用户
new_user = User.create(username='小明', email='xm@example.com')
# 更新数据
User.update(active=False).where(User.username == '小明').execute()
# 删除数据
User.delete().where(User.username == '小明').execute()
3.
玩转关联查询
数据库里表和表之间有关系,Peewee 也能轻松搞定:
class Tweet(Model):
user = ForeignKeyField(User, backref='tweets')
content = TextField()
created_at = DateTimeField()
class Meta:
database = db
# 查询小明发的所有推文
tweets = Tweet.select().join(User).where(User.username == '小明')
温馨提示:创建外键关系的时候,backref参数特别有用,让你能从 User 对象直接访问到它的所有 tweets。
4.
贴心的小功能
Peewee 还有不少实用的功能:
# 分页查询
page = User.select().paginate(1, 20) # 第1页,每页20条
# 聚合查询
total = Tweet.select().count()
latest = Tweet.select().order_by(Tweet.created_at.desc()).first()
# 原生SQL
User.raw('SELECT * FROM user WHERE username = ?', '小明')
有时候会碰到需要用原生 SQL 的场景,Peewee 也考虑到了,直接用raw方法就成。
5.
坑点预警
得提醒下,用 Peewee 也有几个坑:
默认惰性查询,数据不真正用到的时候不会去查数据库
关联查询可能会有 N+1 问题,记得用prefetch优化
字段默认不能为空,要允许空值得显式指定null=True
nickname = CharField(null=True) # 这样才能存空值
写了这么多,我觉得 Peewee 是个特别适合中小型项目的 ORM 框架。代码简洁,上手快,功能也够用。不过数据库操作性能要求特别高的项目,可能还是得上 SQLAlchemy。
一句话:会写 Python,就能用 Peewee。数据库操作从此告别手写 SQL!
贴个小技巧:开发的时候记得打开 SQL 日志,方便调试:
import logging
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
推荐阅读
领取专属 10元无门槛券
私享最新 技术干货