在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的使用差不多,按需使用即可,更多内容的参考官方文档。

运维应用也就拿来做做管理后台,以上基本就能满足绝大多数场景,也不建议用的太过于复杂,维护起来会很痛苦。

参考