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获取Linux系统的各种信息
Jul 10 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
对python中raw_input()和input()的用法详解
Apr 22 Python
python实现录音小程序
Oct 26 Python
Python socket非阻塞模块应用示例
Sep 12 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Python first-order-model实现让照片动起来
Jun 25 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导入Excel到MySQL的方法
2011/04/23 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
python挖矿算力测试程序详解
2019/07/03 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python em算法的实现
2020/10/03 Python
Python 实现一个简单的web服务器
2021/01/03 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
params有什么用
2016/03/01 面试题
银行职业规划书范文
2013/12/28 职场文书
运动会解说词200字
2014/02/06 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
报到证办理个人委托书
2014/10/06 职场文书
写景作文评语集锦
2014/12/25 职场文书