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实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
Django模板Templates使用方法详解
Jul 19 Python
python常用排序算法的实现代码
Nov 08 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
Python 支持向量机分类器的实现
Jan 15 Python
Python新手学习raise用法
Jun 03 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP内核探索:变量概述
2014/01/30 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
js实现计算器功能
2020/08/10 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
人工神经网络算法知识点总结
2019/06/11 Python
python 多进程队列数据处理详解
2019/12/23 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
标准毕业生自荐信范文
2013/11/04 职场文书
查环查孕证明
2014/01/10 职场文书
高中地理教学反思
2014/01/29 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
会计求职信范文
2014/05/24 职场文书
主题团日活动总结
2014/06/25 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
升学宴学生答谢词
2015/01/05 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书