peewee和peewee
作者:Each+ Apollo
目录
文章目录
- 目录
- 一、Meta信息
- 1. database
- 2. table_name
- 3. table_function
- 4. indexes
- 5. primary_key
- 6. constraints
- 7.auto_id_base
- 二、字段
- 三、字段的参数
- 1.通用参数
- 2.特殊参数
- 四、Manager操作
- 1.get 单个查询
- 2.create 生成一条数据
- 3.update 更新数据
- 4.delete 删除
- 5.get_or_create 查询创建
- 6.create_or_get 创建查询
- 7.prefetch 子查询
- 8.count 统计总数
- 9.scalar 查询
- 10.allow_sync () 允许同步
- 11.atomic 开启事务
- 12.execute 执行query
- 13.close 关闭db池子
- 五、Model操作
- 1.create_table 生成物理表(可以同步执行)
- 2.insert 插入新数据
- 3.insert_many 批量插入
- 4.update 更新数据
- 5.replace 新增
- 6.delete 删除
- 7.select 查询
- 8.dicts 转字典
- 9.tuples 只返回值得元组迭代器
- 10.join 连接查询
- 11.where 条件过滤
- 12.order_by 排序
- 13.paginate 分页
- 14.count 总条数
- 15.having 聚合条件筛选
- 16.row 原生语句
- 17.union 合并
- 六、fn操作
- 1.Avg 平均值
- 2.Sum 和
- 3.Max 最大值
- 4.Min 最小值
- 5.Count 合计
- 6.Substr 切片
- 七、Tuple 元组
一、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_nameclass 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 TupleSchool.select(
).where(Tuple(School.id, School.name) == (9, 'jijio')
)
peewee和peewee
作者:Each+ Apollo
目录
文章目录
- 目录
- 一、Meta信息
- 1. database
- 2. table_name
- 3. table_function
- 4. indexes
- 5. primary_key
- 6. constraints
- 7.auto_id_base
- 二、字段
- 三、字段的参数
- 1.通用参数
- 2.特殊参数
- 四、Manager操作
- 1.get 单个查询
- 2.create 生成一条数据
- 3.update 更新数据
- 4.delete 删除
- 5.get_or_create 查询创建
- 6.create_or_get 创建查询
- 7.prefetch 子查询
- 8.count 统计总数
- 9.scalar 查询
- 10.allow_sync () 允许同步
- 11.atomic 开启事务
- 12.execute 执行query
- 13.close 关闭db池子
- 五、Model操作
- 1.create_table 生成物理表(可以同步执行)
- 2.insert 插入新数据
- 3.insert_many 批量插入
- 4.update 更新数据
- 5.replace 新增
- 6.delete 删除
- 7.select 查询
- 8.dicts 转字典
- 9.tuples 只返回值得元组迭代器
- 10.join 连接查询
- 11.where 条件过滤
- 12.order_by 排序
- 13.paginate 分页
- 14.count 总条数
- 15.having 聚合条件筛选
- 16.row 原生语句
- 17.union 合并
- 六、fn操作
- 1.Avg 平均值
- 2.Sum 和
- 3.Max 最大值
- 4.Min 最小值
- 5.Count 合计
- 6.Substr 切片
- 七、Tuple 元组
一、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_nameclass 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 TupleSchool.select(
).where(Tuple(School.id, School.name) == (9, 'jijio')
)