Python ORM编程基础示例


Posted in Python onFebruary 02, 2020

本文实例讲述了Python ORM编程。分享给大家供大家参考,具体如下:

ORM编程

ORM(object-relational mapping)对象关系映射 作用:在关系型数据库和业务实体对象之间做一个映射,方便在开发中,不需要再使用复杂的sql语句,只需要简单操作对象的属性与方法。 所有ORM具备3方面基本能力:映射技术、CRUD操作、缓存优化。每种编程语言都具有自己的ORM库,java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy

1、映射技术

面向对象是从软件工程的基本原则(如耦合、聚合、封装)的基础由来 关系型数据库是从数学理论上的基础发展而来。

ORM库需解决三个问题:

  • 数据类型映射:将数据库的类型映射为编程语言自身的类型;
  • 类映射:将数据表定义映射为编程语言自身的类;
  • 关系映射:将数据库中基于外键的关系连接转换为编程语言中基于对象引用的关系连接。

2、CRUD操作

  • C?Create(增加)
  • R?Retrieve(读取,重新得到数据)
  • U?Update(更新)
  • D?Delete(删除)

在SQL中:insert,select, update,delete四种语句实现CRUD

ORM自动实现以下操作:

  1. 将这些调用转换为SQL语句;
  2. 通过数据库引擎发送个给数据库执行;
  3. 将数据库返回的结果记录用ORM映射技术转换为类对象。

3、缓存优化

  • 将从数据库中查询到的数据以类对象形式保存在本地内存中,以便之后再用时随时抽取。
  • 在真正需要读取查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库。

4、用peewee进行ORM数据库编程

思路:

  • 导入需要的包:peewee,建立一个数据库引擎对象db
  • 定义一个ORM基类:BaseModel(),建立SQLite连接
  • 类型映射:定义一些数据类型
  • 表映射:定义两个对象类:course, teacher
  • 关系映射:使用ForeignKeyField 设置与course的连接关系,其中的参数:to_field用于指定被连接的字段名,related_name参数对该关系赋予了一个名字
import os
if os.path.exists('sampleDB.db'):
  os.remove('sampleDB.db')
# 引入peewee包的所有内容
from peewee import *
# 建立一个Sqlite数据库引擎对象,该引擎打开数据库文件sampleDB.db
db = SqliteDatabase("sampleDB.db")
# 定义一个ORM的基类,在基类中指定本ORM所使用的数据库,
# 这样在之后所有的子类中就不用重复声明数据库
class BaseModel(Model):
  class Meta:
    database = db
# 定义course表,继承自BaseModel
class Course(BaseModel):
  id = PrimaryKeyField() # 定义主键
  title = CharField(null=False) # 定义字符串
  period = IntegerField() # 整型
  description = CharField()
  class Meta:
    order_by = ('title',)
    db_table = 'course'  # 定义数据库中的表名
# 定义 teacher 表,继承自BaseModel
class Teacher(BaseModel):
  id = PrimaryKeyField()
  name = CharField(null=False)
  gender = BooleanField() # 布尔型
  address = CharField()
  # ForeignKeyField 设置与course的连接关系,其中的参数:to_field用于指定被连接的字段名,related_name参数对该关系赋予了一个名字
  course_id = ForeignKeyField(Course, to_field="id", related_name="course")
  class Meta:
    order_by = ('name',)
    db_table = "teacher"
# 建表,仅需创建一次
Course.create_table()
Teacher.create_table()
# 新增行
Course.create(id=1, title='经济学', period=320, description='文理科学生均可选修')
Course.create(id=2, title='大学英语', period=300, description='大一学生必修课')
Course.create(id=3, title='哲学', period=100, description='必修课')
Course.create(id=134, title='编译原理', period=100, description='计算机系选修')
Teacher.create(name='白阵君', gender=True, address='..', course_id=1)
Teacher.create(name='李森', gender=True, address='..', course_id=3)
Teacher.create(name='张雯雯', gender=False, address='..', course_id=2)
# 查询一行
record = Course.get(Course.title == '大学英语')
print("课程:%s, 学时:%d, 课程类型: %s" % (record.title, record.period, record.description))
# 更新
record.period = 200
record.save()
# 删除
record.delete_instance()
# 查询所有记录
courses = Course.select()
for i in courses:
  print(i.id, i.title, i.period, i.description)
# 带条件查询,并将结果按period字段倒序排序
courses = Course.select().where(Course.id< 10).order_by(Course.period.desc())
for i in courses:
  print(i.id, i.title, i.period, i.description)
# 统计所有课程的平均学时
total = Course.select(fn.Avg (Course.period).alias('avg_period'))
for i in total:
  print(u"平均学时:", i.avg_period)
# 更新多个记录
Course.update(period=300).where(Course.id > 100).execute()
# 多表连接操作,Peewee会自动根据ForeignKeyField的外键定义进行连接:
Record = Course.select().join(Teacher).where(Teacher.gender == True)
for i in Record:
  print(i.id, i.title, i.period, i.description)

参考来源:书籍《python 高效开发实战》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中实现常量(Const)功能
Jan 28 Python
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python的时间模块datetime详解
Apr 17 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
pytorch 实现打印模型的参数值
Dec 30 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
python中time包实例详解
Feb 02 Python
python中的被动信息搜集
Apr 29 Python
Python常遇到的错误和异常
Nov 02 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 #Python
flask 框架操作MySQL数据库简单示例
Feb 02 #Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 #Python
使用Python操作ArangoDB的方法步骤
Feb 02 #Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 #Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 #Python
Python递归及尾递归优化操作实例分析
Feb 01 #Python
You might like
php PDO中文乱码解决办法
2009/07/20 PHP
JS 网站性能优化笔记
2011/05/24 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
脚本合并提升javascript性能示例
2014/02/24 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
python使用urllib2提交http post请求的方法
2015/05/26 Python
Python读写文件方法总结
2015/06/09 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
业务主管岗位职责范本
2013/12/25 职场文书
好听的队名和口号
2014/06/09 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
受伤赔偿协议书
2014/09/24 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书