peewee和peewee_async常用汇总(持续更新)
作者: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_async常用汇总(持续更新)相关推荐
- iOS精品资源汇总(持续更新)
文章目录 引言 I.iOS自定义视图相关热门资源 1.1 <用户协议及隐私政策>弹框 1.2 电子签名 1.3 商品详情页 1.4 上传图片视图的封装[支持删除和添加] 1.5 查看风险商 ...
- 【帆软报表】使用技巧及常见问题汇总-持续更新
[帆软报表]使用技巧及常见问题汇总-持续更新 1.重复与冻结设置,做用:冻结区域 模板-重复与冻结设置 2.单元格有效小数设置 选中单元格-格式-数字-#0.00 3.图表中有效小数设置 图表属性表- ...
- Matlab常用代码---持续更新
Matlab中的一些常用代码---持续更新 1. 获取当前的工作目录路径:添加文件夹到工作路径 2. 获取某个.m文件的绝对路径 3. 使用随机颜色进行可视化 1. 获取当前的工作目录路径:添加文件夹 ...
- Telegram Android源码问题汇总 持续更新
libtgvoip目录为空 git clone下来的工程中带有submodule时,submodule的内容没有下载下来,执行如下命令 cd Telegram git submodule update ...
- 吉大计算机专硕报录比,22考研院校报录比汇总(持续更新)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 22考研院校报录比汇总(持续更新) 每个考研的小伙伴最关心的就是你所报考学校的报录比,因为这直接关系到你报考院校的难易程度,从中可以看出各高校的整体录取情 ...
- Unity学习知识和链接汇总-持续更新
Unity学习知识和链接汇总-持续更新 Unity Scripting Reference- https://docs.unity3d.com/Manual/index.html gitee http ...
- 【教程汇总+持续更新】Unity游戏开发从入门到入坟
新的一年,本该在年前整理的年终总结被拖到了年后开工.去年大量时间投入在Catlike教程的翻译上,截止目前位置,教程的进度已经完全追平原作者. 去年还有一部分是断断续续的更新SLG实战教程,但遗憾的是 ...
- Android常用热门开源库汇总(持续更新)
原文转载:https://www.yundashi168.com/344.html 请及时关注原文网站,因为后续持续更新都在原网站更新.请多多点赞和关注. 前言 收集了一些比较常见的开源库,特此记录( ...
- Ios-视频直播-知识点汇总-持续更新
最近公司要求做视频直播,之前工作几年,视频一直都是弱项,没怎么接触过,现在正好有机会深入的去了解一下,记录一些遇到的坑和需要用到的东西. ~公司要求,用HLS协议,要求可以播放m3u8格式的,当时一听 ...
最新文章
- 转发:某些函数需要将其一个或多个实参连同类型不变地转发给其他函数
- dw上按钮事件 pb_「React TS3 专题」使用 TS 的方式在类组件里定义事件
- Python-OpenCV 杂项(一):图像绘制
- 异步和同步区别是什么_一次相亲经历,我彻底搞懂了什么叫阻塞非阻塞,同步异步...
- Nginx中浏览器缓存的执行流程
- java xml 合并_Java中合并XML文档的设计与实现
- jQuery 基础教程 (二)之jQuery对象与DOM对象
- python举两种字符串引号的例子_python里的单引号和双引号的有什么作用
- 用java和mysql开发网站怎么实现_如何用java开发一个网站?
- 微服务架构下的身份认证
- 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...
- 6个最佳的开源Python应用服务器
- 用php实现拍照,php中实现视频拍照
- [WPF] TextBox Metro风格样式
- 输入法相关的测试用例整理
- Python写反斜杠\a
- 大赛来袭 | 千万项目商机+超40W大赛奖金,快来报名吧!
- 史上最全的大数据开发八股文【自己的吐血总结】
- 微信广告+视频号,营销能力全面盘点,视频号是否能做新突破?
- QQ聊天自动刷屏视频课程-范浩浩-专题视频课程
热门文章
- 【未解决】CMD窗口无法显示带颜色文字输出
- 微型6轴惯性导航姿态传感器(IMU)LPMS-BE2 OEM
- 废土行动最新服务器机柜销售,《废土行动》避难所 你想要知道的信息我们一次都告诉你...
- 安卓面试宝典,2021最新Android知识体系总结,面试资料分享
- Android 从系统媒体库中选择视频
- Hadoop集群搭建(三)
- 软件测试真的是吃青春饭的吗?有哪些建议可以给刚入职的测试员?(全是干货)
- 138个医共体!紧密型县域医共体建设和改革,这个省这么干
- MySQL排序(根据中文首字母排序)
- 如何利用Excel批量设置化学式下标