Python ORM编程基础示例
作者:Dawn__Z 发布时间:2021-12-06 14:22:17
本文实例讲述了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自动实现以下操作:
将这些调用转换为SQL语句;
通过数据库引擎发送个给数据库执行;
将数据库返回的结果记录用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程序设计有所帮助。
来源:https://blog.csdn.net/Dawn__Z/article/details/88667119


猜你喜欢
- # -*- coding: utf-8 -*-import random#数字类class NumberItem: &
- 用 docx 模块读取 Worddocx 安装cmd 中输入pip install python-docx 即可安装 docx 模块docx
- eclipse安装Python插件之后,主要是为了方便Python代码就可以再Eclipse进行代码脚本,使用Eclipse开发Python
- 本文实例讲述了Python多线程操作之互斥锁、递归锁、信号量、事件。分享给大家供大家参考,具体如下:互斥锁:为什么要有互斥锁:由于多线程是并
- 直接以数值固定大小根据屏幕大小固定大小禁止最大化按钮MainWindow.setWindowFlags(QtCore.Qt.WindowMi
- 一、基本结构语句一)、条件语句age = int(input("请输入你家狗狗的年龄: "))print("&
- 在做DHTML时,我们在某些情况下要用setAttribute(attri, value)方法定义元素的attribute。同时与getAt
- numpy随机打乱数据方法np.random.shuffleimport numpy as np#实验可得每次shuffle后数据都被打乱,
- 目录1. 折线图概述1.1什么是折线图?1.2折线图使用场景1.3绘制折线图步骤1.4案例展示2. 折线2D属性2.1linestyle:折
- 一道Python面试题的几种解答: 两个元祖T1=('a', 'b'), T2=('c',
- Jquery练习表单验证 <body> <form action="" method="po
- 一个图形化的交互式运行环境,对于编程语言的学习和开发,特别是可视化方面,提供了极大的便利。比如在window上使用R语言进行绘图,在R语言自
- jQuery 将马上发布 1.4 正式版,代码也从 googlecode 上迁移到了 github. jQuery 是我接触的第一个 JS
- 然后给脚本文件运行权限,方法(1)chmod +x ./*.py方法(2)chmod 755 ./*.py (777也无所谓啦)这个命令不去
- 用vue写业务代码时候,后端大神丢给我一堆数据,要求是做全选,反选功能,然后把用户更改的数据全部返回给他基本思路如果父级选中了,那么父级下面
- 你是否曾经想在数据库中存储一个日期而没有时间部分,或者想存储一个时间值希望有更高的精度?在SQL Server 2008的介绍中,微软介绍了
- 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张
- 方式一:叠加文字水印最简单的一种方式是,在图片上绘制半透明文本来实现水印效果。主要用到Figure.text函数参数类型说明x, yfloa
- 全国抗"疫"这么久终于见到曙光,在家待了将近一个月,现在终于可以去上班了,可是却发现出门必备的口罩却一直买不到。最近看到
- 本文实例讲述了php中对象引用和复制。分享给大家供大家参考,具体如下:引用$tv2 = $tv1;或者$tv2 = &$tv1;以上