当前位置: 首页 > 工具软件 > peewee > 使用案例 >

peewee和peewee_async常用汇总(持续更新)

高朝明
2023-12-01

作者:Each+ Apollo

目录

一、Meta信息

1. database

设置模型使用的数据库,可以通过继承设置。也就意味着我们可以写一个基本的model,然后其他model都继承自这个基本model。

class UserModel(Model):
    class Meta:
        database =  MySQLDatabase('my_database')

2. table_name

设置表名,不可以通过继承设置。如果不想使用默认值,每个model在编写时需要手动设置

class UserModel(Model):
	class Meta:
		table_name = 'user_table'

3. table_function

可以设置一个函数用来动态生成表名的功能。可以通过继承设置。

def make_table_name(model_class):
    model_name = model_class.__name__
    return model_name.lower() + '_tbl'

class BaseModel(Model):
    class Meta:
        table_function = make_table_name

class User(BaseModel):
    # table_name will be "user_tbl".

class UserProfile(BaseModel):
    # table_name will be "userprofile_tbl".

4. indexes

设置要索引的字段列表,可以设置联合索引,类似Django的联合索引设置。可以通过继承设置。

class Transaction(Model):
    from_acct = CharField()
    to_acct = CharField()
    amount = DecimalField()
    date = DateTimeField()

    class Meta:
        indexes = (
            # create a unique on from/to/date
            (('from_acct', 'to_acct', 'date'), True),

            # create a non-unique on from/to
            (('from_acct', 'to_acct'), False),
        )

5. primary_key

设置复合主键。可以通过继承设置。

class BlogToTag(Model):
    """A simple "through" table for many-to-many relationship."""
    blog = ForeignKeyField(Blog)
    tag = ForeignKeyField(Tag)

    class Meta:
        primary_key = CompositeKey('blog', 'tag')

6. constraints

设置表约束列表。可以通过继承设置。

class Person(Model):
    first = CharField()
    last = CharField()

    class Meta:
        primary_key = CompositeKey('first', 'last')

class Pet(Model):
    owner_first = CharField()
    owner_last = CharField()
    pet_name = CharField()

    class Meta:
        constraints = [SQL('FOREIGN KEY(owner_first, owner_last) '
                           'REFERENCES person(first, last)')]

7.auto_id_base

主键id从多少起

auto_id_baes = 10000

二、字段

  • AutoField:integer
  • JsonField: 8字节
  • MediumJSONField: 16字节
  • UUIDField:varchar(40)
  • CharField:varchar
  • IntegerField:integer
  • DecimalField:numeric
  • TextField:text
  • DateTimeField:datetime
  • DateField:date
  • TimeField:time
  • FixedCharField:char
  • BigAutoField:bigint
  • BigIntegerField:bigint
  • SmallIntegerField:smallint
  • IdentityField:not supported
  • FloatField:real
  • DoubleField:double precision
  • BlobField:blob
  • BitField:bigint
  • BigBitField:blob
  • BinaryUUIDField:varbinary(16)
  • TimestampField:integer
  • IPField:bigint
  • BooleanField:bool
  • BareField:not supported
  • ForeignKeyField:integer
  • ManyToManyField:无

三、字段的参数

1.通用参数

  • null = False 是否允许空字符串。
  • index = False 是否创建普通索引。
  • unique = False 是否创建唯一索引。
  • column_name = None 在数据库中指定列的名称,一般不设置会使用定义model时的变量名作为列名。
  • default = None 设置默认值。
  • primary_key = False 是否为主键。
  • constraints = None 增加约束,如果增加,该值是一个列表。
  • collation = None 用于排序字段或索引的排序规则。
  • choices = None 设置可选的枚举选项,和Django的ORM射着一样,值是一个元组,元素也是一个元组,例如((1,‘女’),(2,‘男’))。
  • help_text = None 设置备注或注释文本。
  • verbose_name = None 设置一个可读性良好的名称,例如 name = CharField(verbose_name = ‘用户名’)。
  • index_type = None 指定索引类型,不常用,一般默认即可。

2.特殊参数

CharField、FixedCharField:

  • max_length = 32 设置给字段最大长度为32,注意CharField的最大max_length=255。

DateTimeField、DateField、TimeField:
formats = ‘%Y-%m-%d %H:%M:%S’ 设置日期时间的格式化,最常用的格式化。
formats = ‘%Y-%m-%d’ 设置日期的格式化,最常用的格式化。

DecimalField:

  • max_digits = 15 设置要存储的最大位数。
  • decimal_places = 2 设置最大精度。
  • auto_round = True 设置自动舍入值。

ForeignKeyField:

  • model = Model object
    • 这是要引用的model或者外键指向的model,必填。
  • field = Field
    • 设置外键指向model的具体字段,默认是主键,无特殊需求不用更改,默认即可。
  • backref = ‘str’
    • 设置反向引用的访问器名称,类似于Django中设置外键字段是配置的related_name。
  • on_delete = ‘CASCADE’
    • 设置当被引用的记录删除时,指向该记录的数据操作,存在多个可选值:

    • CASCADE 跟随外键一同删除

    • RESTRICT 限制外表中的数据删除,就是当外键删除时,检测到有指向该外键的数据,那么就不允许删除。

    • SET NULL 设置空值

    • SET DEFAULT 设置默认值

    • NO ACTION 不做操作,默认的

  • on_update = ‘CASCADE’
    • 和on_delete作用类似,只是on_update实在外键数据修改时触发。

ManyToManyField:对于这个字段,由于peewee支持的不是很好,建议需要多对多model设计时,使用ForeignKeyField建立第三方表实现。

  • model = Model object 这是要引用的model或者外键指向的model,必填。
  • backref = ‘str’ 设置反向引用的访问器名称,类似于Django中设置外键字段是配置的related_name。
  • on_delete = ‘CASCADE’ 设置当被引用的记录删除时,指向该记录的数据操作,存在多个可选值:
    • CASCADE 跟随外键一同删除
    • RESTRICT 限制外表中的数据删除,就是当外键删除时,检测到有指向该外键的数据,那么就不允许删除。
    • SET NULL 设置空值
    • SET DEFAULT 设置默认值
    • NO ACTION 不做操作,默认的
  • on_update = ‘CASCADE’ 和on_delete作用类似,只是on_update实在外键数据修改时触发。

四、Manager操作

1.get 单个查询

找到了会返回model实例,未找到会抛出异常DoesNotExist

mgr.get(Model, id=1, name='haha')
mgr.get(Model, Model.id == 1, Model.name == 'haha')  
mgr.get(Model.select('id').where(Model.id == 1))  # 指定查询某些字段

2.create 生成一条数据

成功的话返回obj对象,如果参数不填写,会默认‘’

mgr.create(Model, name='hahaha', sort=999)

3.update 更新数据

成功的话返回obj对象,only默认是None,也可以是只修改字段的列表或数组

mgr.update(obj, only=None)  # 传入的obj是模型实例

4.delete 删除

返回删除条数

mgr.delete(obj)

5.get_or_create 查询创建

查询符合某些条件并取出第一个对象,若不存在创建
返回二元数组,第一位是obj对象,第二位是bool,true是新建,false是查询

mgr.get_or_create(Model, defaults=dict(sort=123), name='abcdefg')

6.create_or_get 创建查询

直接创建对象,如果存在,则查找并返回
返回二元数组,第一位是obj对象,第二位是bool,true是新建,false是查询

mgr.create_or_get(Model, name='abcdefg', sort=321, id=75)

7.prefetch 子查询

prefetch(par_query, *subquerys)

mgr.prefetch(
    School.select().where((School.id >= 8) & (School.id <= 10)),
    Class.select(Class.id, Class.school_id),
    
)
for o in obj:
    print('学校>>', o.name, o.id)
    for j in o.class_set:
        print('班级>>', j.name, j.id)

8.count 统计总数

mgr.count(Model.select())

9.scalar 查询

获取第一个模型对象信息,没有则返回None
as_tuple: True返回对象的所有字段值得元组,False返回元组的第一个值,默认False

mgr.scalar(Model.select(), as_tuple=False)

10.allow_sync () 允许同步

with mgr.allow_sync():
    Model.create_table(True)

11.atomic 开启事务

try:
    async with mgr.atomic() as tran:
        mgr.execute(ThatModel.insert(...))
        mgr.execute(ThatModel.update(...))
except Exception as ex:
   logger.exception(ex)

12.execute 执行query

mgr.execute(Model.select())

13.close 关闭db池子

mgr.close()

五、Model操作

1.create_table 生成物理表(可以同步执行)

Model.create_table(True)

2.insert 插入新数据

和create区别是,insert不返回模型实例,只返回id

mgr.execute(
    Model.insert(name='jiojliower', sort=99999)
)

3.insert_many 批量插入

insert_many([data1, data2, data3.....]),返回插入的第一条数据的id
obj = await mgr.execute(
    Model.insert_many([
        dict(name='poiuj', sort=99997),
        dict(name='oiuerte', sort=99996),
    ])
)

4.update 更新数据

返回实际更新的条数

obj = await mgr.execute(
    School.update(
        name='9809808'
    )
)

5.replace 新增

新增一条数据,若违反索引或约束等,则替换数据
obj = await mgr.execute(
Model.replace(
name=‘12313189’
)
)

6.delete 删除

返回删除的条数

obj = await mgr.execute(
    School.delete().where(
        School.name=='12313189'
    )
)

7.select 查询

返回实例对象迭代器

obj = await request.app.mgr.execute(
    Model.select()
)

方法 含义

  • .in_(value) IN查找(与相同<<)。
  • .not_in(value) 不在查询中。
  • .is_null(is_null) 是NULL还是IS NOT NULL。接受布尔参数。
  • .contains(substr) 通配符搜索子字符串。
  • .startswith(prefix) 搜索以开头的值prefix。
  • .endswith(suffix) 搜索以结尾的值suffix。
  • .between(low, high) 在low和之间搜索值high。
  • .regexp(exp) 正则表达式匹配(区分大小写)。
  • .iregexp(exp) 正则表达式匹配(不区分大小写)。
  • .bin_and(value) 二进制AND。
  • .bin_or(value) 二进制或。
  • .concat(other) 使用串联两个字符串或对象||。
  • .distinct() 标记列以进行DISTINCT选择。
  • .collate(collation) 用给定的排序规则指定列。
  • .cast(type) 将列的值强制转换为给定的类型。

8.dicts 转字典

返回字典对象迭代器

obj = await mgr.execute(
    School.select(School.id, School.name).where(School.id >= 90).dicts()
)

9.tuples 只返回值得元组迭代器

obj = await mgr.execute(
    School.select(School.id, School.name).where(School.id >= 90).tuples()
)

10.join 连接查询

会一并查询school的所有字段,若只想查school的某个字段,可以用School.id等

连接方式有

  • JOIN.LEFT_OUTER = ‘LEFT OUTER JOIN’
  • JOIN.RIGHT_OUTER = ‘RIGHT OUTER JOIN’
  • JOIN.INNER = ‘INNER JOIN’
obj = await mgr.execute(
    Class.select(Class.id, School).join(School, JOIN.LEFT_OUTER, on=(Class.school_id == School.id))
)

11.where 条件过滤

方法 意义

  • .in_(value) IN查找(与相同<<)。
  • .not_in(value) 不在查询中。
  • .is_null(is_null) 是NULL还是IS NOT NULL。接受布尔参数。
  • .contains(substr) 通配符搜索子字符串。
  • .startswith(prefix) 搜索以开头的值prefix。
  • .endswith(suffix) 搜索以结尾的值suffix。
  • .between(low, high) 在low和之间搜索值high。
  • .regexp(exp) 正则表达式匹配(区分大小写)。
  • .iregexp(exp) 正则表达式匹配(不区分大小写)。
  • .bin_and(value) 二进制AND。
  • .bin_or(value) 二进制或。
  • .concat(other) 使用串联两个字符串或对象||。
  • .distinct() 标记列以进行DISTINCT选择。
  • .collate(collation) 用给定的排序规则指定列。
  • .cast(type) 将列的值强制转换为给定的类型。

要使用逻辑运算符组合子句,请使用:

  • & 和
(User.is_active == True) & (User.is_admin == True)
  • | 或者
(User.is_admin) | (User.is_superuser)
  • ~ 非
~(User.username.contains('admin'))

12.order_by 排序

  • desc 倒序(从大到小)

Rand(Mysql)和Random(Sqlite)随机排序

obj = await mgr.execute(
    School.select().order_by(
        School.id.desc(),
        School.name
    )
)

order_by(fn.Rand())

13.paginate 分页

obj = await mgr.execute(
    School.select().paginate(page_id, page_size)
)

14.count 总条数

obj = await mgr.execute(
    School.select().count()
)

15.having 聚合条件筛选

obj = await mgr.execute(
    School.select().group_by(School.name).having(fn.COUNT(School.name) > 50)
)

16.row 原生语句

School.raw('SELECT * FROM my_table WHERE data = %s and id = %s', user_data, user_id)

17.union 合并

  • | UNION
    • UNION
  • & INTERSECT
  • - EXCEPT
mgr.execute(
    SenderReceiverInfo.select(SenderReceiverInfo.info_id) | DeliveryOrder.select(DeliveryOrder.sender_info_id.alias('info_id'))
)

六、fn操作

1.Avg 平均值
2.Sum 和
3.Max 最大值
4.Min 最小值
5.Count 合计
6.Substr 切片

第几个开始,取几个,1是第一个

School.select(
).where(
    fn.Substr(School.name, 1, 6) == 'zxcvbv'
)

七、Tuple 元组

 from peewee import Tuple
 School.select(
).where(
    Tuple(School.id, School.name) == (9, 'jijio')
)
 类似资料: