作者: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常用汇总(持续更新)相关推荐

  1. iOS精品资源汇总(持续更新)

    文章目录 引言 I.iOS自定义视图相关热门资源 1.1 <用户协议及隐私政策>弹框 1.2 电子签名 1.3 商品详情页 1.4 上传图片视图的封装[支持删除和添加] 1.5 查看风险商 ...

  2. 【帆软报表】使用技巧及常见问题汇总-持续更新

    [帆软报表]使用技巧及常见问题汇总-持续更新 1.重复与冻结设置,做用:冻结区域 模板-重复与冻结设置 2.单元格有效小数设置 选中单元格-格式-数字-#0.00 3.图表中有效小数设置 图表属性表- ...

  3. Matlab常用代码---持续更新

    Matlab中的一些常用代码---持续更新 1. 获取当前的工作目录路径:添加文件夹到工作路径 2. 获取某个.m文件的绝对路径 3. 使用随机颜色进行可视化 1. 获取当前的工作目录路径:添加文件夹 ...

  4. Telegram Android源码问题汇总 持续更新

    libtgvoip目录为空 git clone下来的工程中带有submodule时,submodule的内容没有下载下来,执行如下命令 cd Telegram git submodule update ...

  5. 吉大计算机专硕报录比,22考研院校报录比汇总(持续更新)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 22考研院校报录比汇总(持续更新) 每个考研的小伙伴最关心的就是你所报考学校的报录比,因为这直接关系到你报考院校的难易程度,从中可以看出各高校的整体录取情 ...

  6. Unity学习知识和链接汇总-持续更新

    Unity学习知识和链接汇总-持续更新 Unity Scripting Reference- https://docs.unity3d.com/Manual/index.html gitee http ...

  7. 【教程汇总+持续更新】Unity游戏开发从入门到入坟

    新的一年,本该在年前整理的年终总结被拖到了年后开工.去年大量时间投入在Catlike教程的翻译上,截止目前位置,教程的进度已经完全追平原作者. 去年还有一部分是断断续续的更新SLG实战教程,但遗憾的是 ...

  8. Android常用热门开源库汇总(持续更新)

    原文转载:https://www.yundashi168.com/344.html 请及时关注原文网站,因为后续持续更新都在原网站更新.请多多点赞和关注. 前言 收集了一些比较常见的开源库,特此记录( ...

  9. Ios-视频直播-知识点汇总-持续更新

    最近公司要求做视频直播,之前工作几年,视频一直都是弱项,没怎么接触过,现在正好有机会深入的去了解一下,记录一些遇到的坑和需要用到的东西. ~公司要求,用HLS协议,要求可以播放m3u8格式的,当时一听 ...

最新文章

  1. 转发:某些函数需要将其一个或多个实参连同类型不变地转发给其他函数
  2. dw上按钮事件 pb_「React TS3 专题」使用 TS 的方式在类组件里定义事件
  3. Python-OpenCV 杂项(一):图像绘制
  4. 异步和同步区别是什么_一次相亲经历,我彻底搞懂了什么叫阻塞非阻塞,同步异步...
  5. Nginx中浏览器缓存的执行流程
  6. java xml 合并_Java中合并XML文档的设计与实现
  7. jQuery 基础教程 (二)之jQuery对象与DOM对象
  8. python举两种字符串引号的例子_python里的单引号和双引号的有什么作用
  9. 用java和mysql开发网站怎么实现_如何用java开发一个网站?
  10. 微服务架构下的身份认证
  11. 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...
  12. 6个最佳的开源Python应用服务器
  13. 用php实现拍照,php中实现视频拍照
  14. [WPF] TextBox Metro风格样式
  15. 输入法相关的测试用例整理
  16. Python写反斜杠\a
  17. 大赛来袭 | 千万项目商机+超40W大赛奖金,快来报名吧!
  18. 史上最全的大数据开发八股文【自己的吐血总结】
  19. 微信广告+视频号,营销能力全面盘点,视频号是否能做新突破?
  20. QQ聊天自动刷屏视频课程-范浩浩-专题视频课程

热门文章

  1. 【未解决】CMD窗口无法显示带颜色文字输出
  2. 微型6轴惯性导航姿态传感器(IMU)LPMS-BE2 OEM
  3. 废土行动最新服务器机柜销售,《废土行动》避难所 你想要知道的信息我们一次都告诉你...
  4. 安卓面试宝典,2021最新Android知识体系总结,面试资料分享
  5. Android 从系统媒体库中选择视频
  6. Hadoop集群搭建(三)
  7. 软件测试真的是吃青春饭的吗?有哪些建议可以给刚入职的测试员?(全是干货)
  8. 138个医共体!紧密型县域医共体建设和改革,这个省这么干
  9. MySQL排序(根据中文首字母排序)
  10. 如何利用Excel批量设置化学式下标