在Python ORM的选型过程中,我们经常会拿Peewee和SQLAlchemy进行对比。
从功能的全面与强大而言,在大型项目中,肯定优先选择SQLAlchemy。作为运维而言,大多都是中小型项目居多,Peewee作为轻量级的ORM,使用也非常简单,自然作为首选了。
下面介绍了大致的使用方式。
创建数据库连接
直接创建连接
from peewee import MySQLDatabase
db = MySQLDatabase(
'database_name',
user='root',
password='secret',
host='db.xwl.io',
charset='utf8mb4')
当然我们更多的是配合连接池使用
from playhouse.pool import PooledMySQLDatabase
db = PooledMySQLDatabase(
'database_name',
max_connections=8,
stale_timeout=300,
user='root')
class BaseModel(Model):
class Meta:
database = db
创建模型表
通常的做法是定义一个公共的Model,用于存储公共的字段和方法。
import datetime
from peewee import Model, DateTimeField, IntegerField
class BaseModel(Model):
create_time = DateTimeField(default=datetime.datetime.now)
update_time = DateTimeField(default=datetime.datetime.now)
deleted = IntegerField()
def save(self, *args, **kwargs):
self.update_time = datetime.datetime.now()
return super(BaseModel, self).save(*args, **kwargs)
class Meta:
database = db
在SQLAlchemy中,在定义字段的时候,可以使用onupdate
关键字,在Peewee的模块中可没有这个功能过,于是我们重构的save
方法。
除此之外,其实还有一些公共的字段,比如主键id、操作用户等,也可以放置于BaseModel
中。
我们尝试创建一个用户表:
from peewee import AutoField, CharField
class User(BaseModel):
class Meta:
table_name = 'user'
id = AutoField()
username = CharField(max_length=32)
修改内置的table_name
字段可以定义创建表结构时使用的表名称,AutoField
的意思是一个自增的主键ID,CharField
在MySQL中就是varchar,max_length
就是定义该字段的最大长度。
字段类型表如下图所示
创建表也非常简单
db.create_tables([User])
默认情况下,peewee包括 IF NOT EXISTS 创建表时使用子句。
存储与检索数据
增
添加一行数据
user = User(username="xwl")
user.save()
或者可以使用一段JSON格式的数据
data = {"username": "xwl"}
user = User(**data)
user.save()
删
User.delete().where(User.id == 1).execute()
改
User.update(username="xwl-2").where(User.id == 1).execute()
查
查询数据的基本格式是这样
select_queries = User.select(...).where(...).order_by(...).limit(...)...
就跟SQL的使用差不多,按需使用即可,更多内容的参考官方文档。
运维应用也就拿来做做管理后台,以上基本就能满足绝大多数场景,也不建议用的太过于复杂,维护起来会很痛苦。