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实现udp数据报传输的方法
Sep 26 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
Python模块WSGI使用详解
Feb 02 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
Mar 31 Python
运行django项目指定IP和端口的方法
May 14 Python
python与caffe改变通道顺序的方法
Aug 04 Python
python斐波那契数列的计算方法
Sep 27 Python
Python可以实现栈的结构吗
May 27 Python
python爬虫要用到的库总结
Jul 28 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
python正则表达式re.search()的基本使用教程
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
用户的详细注册和判断
2006/10/09 PHP
使用 php4 加速 web 传输
2006/10/09 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php取出数组单个值的方法
2018/03/12 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
IE iframe的onload方法分析小结
2010/01/07 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
JavaScript函数详解
2014/11/17 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
javascript基本算法汇总
2016/03/09 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
python实现3D地图可视化
2020/03/25 Python
护理学毕业生求职信
2013/11/14 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
门卫管理制度范本
2015/08/05 职场文书
Nginx如何配置根据路径转发详解
2022/07/23 Servers