Peewee作为Python ORM之一

优势:简单,小巧,易学习,使用直观

不足之处:需要手动创建数据库

基本使用流程

1⃣️根据需求定义好Model(表结构类)

2⃣️通过create_tables()创建表

示例:

  1. from peewee import *
  2.  
  3. # 连接数据库
  4. database = MySQLDatabase('test', user='root', host='localhost', port=3306)
  5.  
  6. # 定义Person
  7. class Person(Model):
  8. name = CharField()
  9. birthday = DateField()
  10. is_relative = BooleanField()
  11.  
  12. class Meta:
  13. database = database
  1. # 创建表
  2. Person.create_table()
  3. # 创建多个表
  4. # database.create_tables([Person,...])

技巧:已经创建好数据库表了,可以通过python -m pwiz脚本工具直接创建Model

  1. # 指定mysql,用户为root,host为localhost,数据库为test
  2. python -m pwiz -e mysql -u root -H localhost --password test > xModel.py
  1. from peewee import *
  2.  
  3. database = MySQLDatabase('test', **{'charset': 'utf8', 'use_unicode': True, 'host': 'localhost', 'user': 'root', 'password': ''})
  4.  
  5. class UnknownField(object):
  6. def __init__(self, *_, **__): pass
  7.  
  8. class BaseModel(Model):
  9. class Meta:
  10. database = database
  11.  
  12. class Person(BaseModel):
  13. birthday = DateField()
  14. is_relative = IntegerField()
  15. name = CharField()
  16.  
  17. class Meta:
  18. table_name = 'person'

  1. PS关于数据类型:
    CharFieldDateFieldBooleanField等这些类型与数据库中的数据类型一一对应,
    我们直接使用它就行,至于CharField => varchar(255)这种转换Peewee已经为我们做好了。
  2. 增删改查操作:
    一、增/插入数据
    实例化一个Model
    插入到数据库
  3. 1⃣️save()方法
  1. # 插入一条数据
  2. p = Person(name='xxx', birthday=date(1993, 1, 20), is_relative=True)
  3. p.save()

  2⃣️insert()方法

  1. # 插入一条数据
  2. p_id = Person.insert({
  3. 'name': 'xxx'
  4. }).execute()
  5.  
  6. # 打印出新插入数据的id
  7. print(p_id)
  8.  
  9. 会返回新插入数据的主键

3⃣️insert_many() 多条插入

  1. NUM = 10000
  2. data = [{
  3. 'name': 'xxx'
  4. } for i in range(NUM)]
  5.  
  6. with database.atomic(): #事务
  7. for i in range(0, NUM, 100):
  8. # 每次批量插入100条,分成多次插入
  9. Person.insert_many(data[i:i + 100]).execute()
  1. 二、查/查询数据
  1. 1⃣️get()获取单条数据
  1. # 查询name为xxx的Person
  2. p = Person.get(Person.name == 'xxx')
  3. print(p.name) # 打印

2⃣️select()查询多条数据

  1. # 查询Person整张表的数据
  2. persons = Person.select()
  3. # 遍历数据
  4. for p in persons:
  5. print(p.name, p.birthday, p.is_relative)

  3⃣️where()当做查询条件

  1. # 获取is_relative为True的数据
  2. persons = Person.select().where(Person.is_relative == True)
  3. for p in persons:
  4. print(p.name, p.birthday, p.is_relative)
  5.  
  6. 通过sql()方法转换为SQL语句进行查看理解
  7. persons = Person.select().where(Person.is_relative == True)
  8. print(persons.sql())
  9. # 打印出的结果为:('SELECT `t1`.`id`, `t1`.`name`, `t1`.`is_relative` FROM `Person` AS `t1` WHERE (`t1`.`is_relative` = %s)', [True])

4⃣️count()数据条数 order_by()排序 limit()限制数量

  1. # 查询整张表的数据条数
  2. total_num = Person.select().count()
  3.  
  4. # 查询name为xxx的Person数量, 返回数量
  5. num = Person.select().where(Person.name == 'xxx').count()
  6.  
  7. # 按照主键id降序排序
  8. persons = Person.select().order_by(Person.id.desc())
  9.  
  10. # 按照主键id升序排序
  11. persons = Person.select().order_by(Person.id.asc())
  12.  
  13. # 相当于sql语句: select * from person order by id desc limit 5
  14. persons = Person.select().order_by(Person.id.asc()).limit(5)
  15.  
  16. # 相当于sql语句中:select * from person order by id desc limit 2, 5
  17. persons = Person.select().order_by(Person.id.asc()).limit(5).offset(2)
  1. 三、改/更新数据
    1⃣️当一个Model实例拥有主键时,此时使用save()就是修改数据
  1. # 已经实例化的数据,指定了id这个primary key,则此时保存就是更新数据
  2. p = Person(name='xxx', birthday=date(1993, 1, 20), is_relative=False)
  3. p.id = 1
  4. p.save()

  1. 2⃣️update()来更新数据,一般会搭配where()使用
  1. # 更新birthday数据
  2. q = Person.update({Person.birthday: date(1993, 1, 19)}).where(Person.name == 'xxx')
  3. q.execute()
  4.  
  5. q = Person.update({
  6. 'birthday': date(1993, 1, 19)
  7. }).where(Person.name == 'xxx')
  8. q.execute()
  1.  
  1. 四、删/删除数据
  1. 1⃣️delete() + where()
  1. # 删除姓名为xxx的数据
  2. Person.delete().where(Person.name == 'xxx').execute()

2⃣️delete_instance()

  1. # 已经实例化的数据, 使用delete_instance
  2. p = Person(name='xxx', birthday=date(1993, 1, 20), is_relative=False)
  3. p.id = 1
  4. p.save()
  5. p.delete_instance()
  1. 五、常用查询操作符
  1. 1⃣️容易理解
  1. ==、<、<=、>、>=、!=
    等于、小于、小于等于、大于、大于等于、不等于
    2⃣️需要关注

  <<>> 和 %

  1. # <<使用,查询省份属于河北和河南的,对应sql语句:select * from person where province in ('河南', '河北')
  2. persons = Person.select().where(Person.province << ['河南', '河北'])
  3.  
  4. # >>使用,查询省份为空的,sql语句: select * from person where province is Null
  5. persons = Person.select().where(Person.province >> None)
  6.  
  7. # %使用,查询省份中含有 湖 字,sql语句:select * from person where province like '%湖%'
  8. persons = Person.select().where(Person.province % '%湖%')
  1. 六、联表查询
  1. query = (
  2. Person.select(Person.content, Person.timestamp, Person.username)
  3. .join(User, on=(User.id ==Person.user_id)
  4. )
  5.  
  6. for person in query:
  7. print(person.content, person.timestamp, person.user.username)
  8.  
  9. 换句话说就是:
  10. person里的user_id 绑定成一个‘User属性’,
  11. 查询时候直接当作一个属性对象拿取
  12. person.user.username
  1. 七、事务
    Database.atomic()方法
  1. from xModels import XUser, database
  2.  
  3. with database.atomic() as transaction:
  4. XUser.create(phone='xxxxxxxxxxx', password='')
  5. XUser.create(phone='xxxxxxxxxx$', password='')

参考:http://docs.peewee-orm.com/en/latest/peewee/querying.html#querying

 

peewee 通俗易懂版的更多相关文章

  1. 转:怎么使用github(通俗易懂版)

    转:  https://www.zhihu.com/question/20070065 作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/ans ...

  2. TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经 ...

  3. [网络必学]TCP/IP四层模型讲解【笔记整理通俗易懂版】

    OSI七层模型     表示层:用来解码不同的格式为机器语言,以及其他功能. 会话层:判断是否需要网络传输. 传输层:识别端口来指定服务器,如指定80端口的www服务. 网络层:提供逻辑地址选路,即发 ...

  4. TCP三次握手四次挥手,通俗易懂版

    三次握手四次挥手 三次握手 其实很好理解,三次握手就是保证双手都有发送和接受的能力.那么最少三次才能验证完成 即----> 客户端发送---服务端收到----服务端发送-- 1.客户端发送 -- ...

  5. 通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)

    情景:你接到xx公司面试邀请,你怀着激动忐忑的心坐在对方公司会议室,想着等会的技术面试.技术总监此时走来,与你简单交谈后.... 技术:你对GC垃圾回收机制了解的怎么样? 你:还行,有简单了解过. 技 ...

  6. window.history

    作者:zccst 旧版: forword() backword() go(number) HTML5中新增了 onhashchange  浏览器兼容性较好,用得较多 pushState / repla ...

  7. GithubPages + Hexo + Disqus博客教程

    文章主要描述了利用github page,hexo静态博客框架以及disqus来搭建个人静态博客的详细步骤. github page用来搭建博客的主页,hexo用来更改博客主题.发布文章等等,并通过配 ...

  8. (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)

    @翻译:huangyongye 原文链接: Understanding LSTM Networks 前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LST ...

  9. 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

    http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...

随机推荐

  1. 关于QQ屏蔽某些文件上传一些有意思的事

    起因是因为某鱼事件... 资源倒是找了,可是因为TX的屏蔽文件上传.文件通过几次改名之后也没能上传成功(想想也没那么简单). 然后某神就写了上面那串代码实现上传.具体思想是:绕过文件摘要算法(hash ...

  2. s21day17 python笔记

    s21day17 python笔记 一.内容回顾及补充 回顾 补充 第三方模块补充 需要下载安装后才能导入使用 安装方式: pip包管理工具 # 把pip.exe 所在的目录添加到环境变量中. pip ...

  3. 测试那些事儿-Jmeter介绍及使用

    Jmeter与LR有啥区别? Jmeter工具组成部分: 1.资源生成器:用于生成测试过程中服务器,负载机的资源代码.(LR中的VuGen) 2.用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指 ...

  4. javascript最全最好的判断数组的方法

    var arr = [1,2,3,1]; var arr2 = [{ abac : 1, abc : 2 }]; function isArrayFn(value){ if (typeof Array ...

  5. angularjs - 自定义指令(directive)

    自定义指令(directive) 使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名. 例子:使用驼峰法来命名一个指令, demoDirect ...

  6. 我的代码-statistic analysis

    # coding: utf-8 # In[1]: # numpy and pandas for data manipulationimport numpy as npimport pandas as ...

  7. mysql执行sql脚本文件

    mysql执行sql脚本文件 方法一:使用cmd命令执行(windows下,unix或Linux在的其控制台下) [MySQL的bin目录]\mysql –u用户名 –p密码 –D数据库<[sq ...

  8. liunx问题集

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB 1.wget -i -c http://dev ...

  9. Scala基础

    1.seq[String] 用[]表示参数类型,java使用<>表示参数,因为Scala 允许以<命名方法和变量名,java不允许 2.支持range的类型:Char .Int . ...

  10. flutter 容器 几种写法

    1.Stack: 取代线性布局 (译者语:和Android中的LinearLayout相似),Stack允许子 widget 堆叠, 你可以使用 Positioned 来定位他们相对于Stack的上下 ...