Python ORM框架Peewee用法详解


Posted in Python onApril 29, 2020

之前在学Django时,发现它的模型层非常好用,把对数据库的操作映射成对类、对象的操作,避免了我们直接写在Web项目中SQL语句,当时想,如果这个模型层可以独立出来使用就好了,那我们平台操作数据库也可以这么玩了,我不喜欢写SQL语句。

后来才知道,原来这个叫ORM(Object Relational Mapping,对象关系映射),在Python下面有很多这样的类库,如SQLObject、Storm、peewee和SQLAlchemy。

这里就给你们介绍一下Peewee的基本使用,因为它非常的轻量级,最主要是和Django的ORM 操作很像,如果你学过Django那么很容易上手。

一、安装peewee

安装非常简单,推荐使用pip命令。

> pip install peewee

Python ORM框架Peewee用法详解

另外,你也可以通过下载包安装:https://pypi.python.org/pypi/peewee

二、创建表

from peewee import *
import datetime
db = MySQLDatabase("guest", host="127.0.0.1", port=3306, user="root", passwd="123456")
db.connect()
class BaseModel(Model):

  class Meta:
    database = db
class User(BaseModel):
  username = CharField(unique=True)
class Tweet(BaseModel):
  user = ForeignKeyField(User, related_name='tweets')
  message = TextField()
  created_date = DateTimeField(default=datetime.datetime.now)
  is_published = BooleanField(default=True)


if __name__ == "__main__":
  # 创建表
  User.create_table() # 创建User表
  Tweet.create_table() # 创建Tweet表

这里面包含不了少知识点,我们来一一解释。

首先,导入peewee库下面的所有方法,这个当然需要。

然后,通过MySQLDatabase连接数据库,把数据连接的几个必要参数一一填写。通过connect()方法与MySQL数据库建立链接。

接下来就是表的创建,创建BaseModel类,在该类下创建子类Meta,Meta是一个内部类,它用于定义peewee的Model类的行为特性。指定dabatase 为 前面定义的db。

再接下来就是表的创建了,我们在SQL语句创建表时一般需要知道以下信息。表的名字,表有哪些字段?这些字段分别是什么类型?是否允许为空,或自增?哪个字段是主键是?哪个是外键?

ORM用编程语言里的概念帮我们映射了这些东西。

创建 User 和 Tweet类做为表名。在类下面定义的变量为字段名,如username、message、created_date等。通过CharField、DateTimeField、BooleanField表示字段的类型。ForeignKeyField 建立外键。 主键呢? 建表时不都要有个主键id嘛,不用!peewee默认已经为我们加上这个id了。

最后,执行create_table()方法创建两张表。

通过数据库工具,查看生成的两张表。

Python ORM框架Peewee用法详解

Python ORM框架Peewee用法详解

三、插入数据

要想操作表数据,首先表里得有数据。先来看看如何添加数据。

if __name__ == "__main__":
  # ...
  user = User.create(username='tom')
  Tweet.create(user=user, message="这是一段文字")

这样就要User表里添加一个tom的用户,这用户发了一条Tweet,在Tweet表里。但这个用户兴致来了,想继续发第二条Tweet。于是:

if __name__ == "__main__":
  # ...
  Tweet.create(user_id=1, message="这是第二段文字")

咦~!?不对,我们没有创建user_id字段啊!但是,如果你查询Tweet表,就会发现有这个字段,用它来关联User表的id。

Python ORM框架Peewee用法详解

四、查询数据

接下来,查询数据。

if __name__ == "__main__":
  # ...
  # 查询 1
  t = Tweet.get(message="这是一段文字")
  print(t.user_id)
  print(t.created_date)
  print(t.is_published)

查询结果:

12017-05-19 15:44:32True

不过,get()方法只能查询一条,且是唯一的一条数据;通过查询条件不能查询出多条,也不能查询出0条。

if __name__ == "__main__": # ... # 查询 2 ts = Tweet.filter(user_id=1) for t in ts: print(t.message)

运行结果:

这是一段文字这是第二段文字

而,filter()方法,就会更加灵活,可以查询多条结果,并把结果循环输出。

五、Playhouse库

Playhouse库中提供了一些比较有意思的方法。当我们在安装peewee时,也会捎带着把它装上。

这里只介绍它里面的model_to_dict和dict_to_model两个方法。

model_to_dict方法用法:

from playhouse.shortcuts import model_to_dict, dict_to_model

# ……

if __name__ == "__main__":
  # ……
  user = User.create(username='jack')
  # 把数据对象转成字典
  u = model_to_dict(user)  
  print(u)

运行结果:

{'id': 7, 'username': 'jack'}

dict_to_model方法用法:

from playhouse.shortcuts import model_to_dict, dict_to_model

# ……

if __name__ == "__main__":
  # ……
  # 把字典转成数据对象
  user_data = {'id': 2, 'username': 'charlie'}
  user = dict_to_model(User, user_data)
  print(user.username)

运行结果:

charlie

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 判断自定义对象类型
Mar 21 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
python实现多张图片拼接成大图
Jan 15 Python
在python中画正态分布图像的实例
Jul 08 Python
django创建简单的页面响应实例教程
Sep 06 Python
django 实现简单的插入视频
Apr 07 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
Python如何转换字符串大小写
Jun 04 Python
利用Python实现模拟登录知乎
May 25 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 #Python
Pytorch十九种损失函数的使用详解
Apr 29 #Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 #Python
Python爬虫工具requests-html使用解析
Apr 29 #Python
Python基于Hypothesis测试库生成测试数据
Apr 29 #Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 #Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 #Python
You might like
调频问题解答
2021/03/01 无线电
thinkphp实现like模糊查询实例
2014/10/29 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
基于python历史天气采集的分析
2019/02/14 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python使用配置文件过程详解
2019/12/28 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
幼儿教师思想汇报
2014/01/10 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL
MySQL学习之基础命令实操总结
2022/03/19 MySQL
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript