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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
浅析Python的Django框架中的Memcached
Jul 23 Python
Python使用matplotlib绘制随机漫步图
Aug 27 Python
python中字符串内置函数的用法总结
Sep 13 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 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脚本的10个技巧(8)
2006/10/09 PHP
php 生成WML页面方法详解
2009/08/09 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
python中os操作文件及文件路径实例汇总
2015/01/15 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
在python中做正态性检验示例
2019/12/09 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
Python如何定义接口和抽象类
2020/07/28 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
办理生育手续介绍信
2014/01/14 职场文书
社区科普工作方案
2014/06/03 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python