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编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
python把1变成01的步骤总结
Feb 27 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
python 下载m3u8视频的示例代码
Nov 11 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
python spilt()分隔字符串的实现示例
May 21 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/10/19 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
美术社团活动总结
2014/06/27 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
个人工作决心书
2015/09/22 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Python作用域和名称空间的详细介绍
2022/04/13 Python