peewee 很适宜用来解决一些简略的 crud 工作,如果是简单的查问语句,我更加喜爱用 raw sql 来解决

用 join 查问来举例子:

models.py

from peewee import *import settingshost = settings.DATABASE.hostport = settings.DATABASE.portusername = settings.DATABASE.usernamepassword = settings.DATABASE.passworddatabase_name = settings.DATABASE.databasedb = MySQLDatabase(    database=database_name,    host=host,    port=port,    user=username,    password=password)class User(Model):    id = AutoField()    name = CharField(max_length=255, null=False)    created_at = DateTimeField(        null=False,        constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')],        help_text='应用数据库工夫'    )    updated_at = DateTimeField(        null=False,        constraints=[            SQL('DEFAULT CURRENT_TIMESTAMP'),            SQL('ON UPDATE CURRENT_TIMESTAMP'),        ]    )    class Meta:        database = db        table_name = 'account'class Order(Model):    """ 订单信息表 """    id = AutoField(primary_key=True)    user_id = IntegerField(null=False, unique=False, index=True)    product_id = IntegerField(null=False, unique=False)    activity_id = IntegerField(null=False, unique=False)    is_paid = BooleanField(null=False, unique=False, default=False)    created_at = DateTimeField(        null=False,        constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')]    )    updated_at = DateTimeField(        null=False,        constraints=[            SQL('DEFAULT CURRENT_TIMESTAMP'),            SQL('ON UPDATE CURRENT_TIMESTAMP'),        ]    )    class Meta:        database = db        table_name = 'order'        # http://docs.peewee-orm.com/en/latest/peewee/models.html?highlight=table%20generation#multi-column-indexes        indexes = (            # create a unique on,限购一次            (('user_id', 'product_id', 'activity_id'), True),        )

查问一些数据

order

insert into `order` (user_id,product_id,activity_id,is_paid) values (1,2,3,0)insert into `order` (user_id,product_id,activity_id,is_paid) values (2,3,4,0)

account

insert into `account` (name) values ('jike')insert into `account` (name) values ('ponponon')

看看插入后的后果

MySQL root@192.168.31.245:seckill> select * from account;+----+----------+---------------------+---------------------+| id | name     | created_at          | updated_at          |+----+----------+---------------------+---------------------+| 1  | jike     | 2022-04-06 13:26:28 | 2022-04-06 13:31:34 || 2  | ponponon | 2022-04-06 13:26:35 | 2022-04-06 13:26:35 |+----+----------+---------------------+---------------------+2 rows in setTime: 0.005s

各两条

MySQL root@192.168.31.245:seckill> select * from `order`+----+---------+------------+-------------+---------+---------------------+---------------------+| id | user_id | product_id | activity_id | is_paid | created_at          | updated_at          |+----+---------+------------+-------------+---------+---------------------+---------------------+| 1  | 1       | 2          | 3           | 0       | 2022-04-06 13:25:19 | 2022-04-06 13:25:19 || 2  | 2       | 3          | 4           | 0       | 2022-04-06 13:25:28 | 2022-04-06 13:25:28 |+----+---------+------------+-------------+---------+---------------------+---------------------+2 rows in setTime: 0.007s

应用单元测试的脚本来验证

import unittestfrom loguru import loggerfrom models import dbfrom pymysql.cursors import Cursorclass TestProject(unittest.TestCase):    def peewee_exec_raw_sql(self):        """        python -m unittest tests.TestProject.peewee_exec_raw_sql        """        # cursor = db.cursor()        with db.cursor() as cursor:            cursor: Cursor            sql = """            SELECT                 `account`.`id`,                `account`.`name`,                `order`.`product_id`            FROM                 `account`                INNER JOIN `order` ON (`account`.`id` = `order`.`user_id`)            """            cursor.execute(sql)            rows: tuple[tuple] = cursor.fetchall()            for row in rows:                logger.debug(row)

执行后果

─➤  python -m unittest tests.TestProject.peewee_exec_raw_sql2022-04-06 13:37:20.893 | DEBUG    | tests:peewee_exec_raw_sql:36 - (1, 'jike', 2)2022-04-06 13:37:20.894 | DEBUG    | tests:peewee_exec_raw_sql:36 - (2, 'ponponon', 3).----------------------------------------------------------------------Ran 1 test in 0.005s

参考文章:
Python编程:peewee执行多条原生sql语句
This document describes changes to be aware of when switching from 2.x to 3.x.