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实现发送email的几种常用方法
Aug 18 Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
pyinstaller打包程序exe踩过的坑
Nov 19 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
asyncio异步编程之Task对象详解
Mar 13 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
二级域名转向类
2006/11/09 Javascript
为指定元素增加样式的js代码
2009/12/09 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
VUE重点问题总结
2018/03/19 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
python实现网页录音效果
2020/10/26 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
授权委托书样本
2014/04/03 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
成绩单家长意见
2015/06/03 职场文书
python​格式化字符串
2022/04/20 Python