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简单的函数定义和用法实例
May 07 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
python 如何在list中找Topk的数值和索引
May 20 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
关于js与php互相传值的介绍
2013/06/25 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
python中星号变量的几种特殊用法
2016/09/07 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python操作文件的参数整理
2019/06/11 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
架构师岗位职责
2013/11/18 职场文书
材料化学专业求职信
2014/07/15 职场文书
加薪通知
2015/04/25 职场文书
教师节倡议书2015
2015/04/27 职场文书
Nginx跨域问题解析与解决
2022/08/05 Servers