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使用代理抓取网站图片(多线程)
Mar 14 Python
python进阶教程之异常处理
Aug 30 Python
Python的动态重新封装的教程
Apr 11 Python
Python实现单词翻译功能
Jun 06 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
简述 Python 的类和对象
Aug 21 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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实现多张图片上传加水印技巧
2013/04/18 PHP
javascript 打印页面代码
2009/03/24 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
js比较日期大小的方法
2015/05/12 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
python实现哈希表
2014/02/07 Python
Python中List.index()方法的使用教程
2015/05/20 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
python模块之re正则表达式详解
2017/02/03 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python移位运算的实现
2019/07/15 Python
Python实现代码统计工具
2019/09/19 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
Python urllib2运行过程原理解析
2020/06/04 Python
JS原生实现轮播图的几种方法
2021/03/23 Javascript
语文教师个人工作总结
2015/02/06 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
贷款收入证明格式
2015/06/24 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
golang实现浏览器导出excel文件功能
2022/03/25 Golang