Flask数据库模型之数据库模型关系反向映射(四)
Flask数据库关系反向映射
db.relationship 当前字段用于一对多或者多对多反向映射:
- 第一个参数是 映射向的模型名称
- Secondary 参数 指向多对多的关系表
- backref 参数指向反向映射字段,反向映射表通过该字段查询当前表内容
- lazy
select 访问该字段时候,加载所有的映射数据
joined 对关联的两个表多表和关系表进行join查询
dynamic 不加载数据
通俗了说,select就是访问到属性的时候,就会全部加载该属性的数据。joined则是在对关联的两个表进行join操作,从而获取到所有相关的对象。dynamic则不一样,在访问属性的时候,并没有在内存中加载数据,而是返回一个query对象, 需要执行相应方法才可以获取对象,比如.all().下面结合实例解释这几个的使用场景
一对多关系反向映射
例:
课程和老师是一对多
- 一个课程有多位授课老师
- 一个授课老师只可以完成一门课的授课
给两个表插入一条数据
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)BASE_DIR = os.path.abspath(os.path.dirname(__file__))# app.config返回类字典对象,里面用来存放当前app实例的配置
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///"+os.path.join(BASE_DIR,"Student.sqlite")
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True# 关联sqlalchemy和flask应用
db = SQLAlchemy(app)# 创建数据库回话,基于会话进行增删改查
session = db.session()class BaseModel(db.Model):__abstract__ = True # 抽象表为True,代表当前类为抽象类,不会被创建id = db.Column(db.Integer,primary_key=True,autoincrement=True)# 数据保存方法def save(self):session.add(self)session.commit()# 数据删除方法def delete_data(self):session.delete(self)session.commit()class Course(BaseModel):"""课程表"""__tablename__ = "course"name = db.Column(db.String(32))description = db.Column(db.Text)to_teacher = db.relationship('Teacher', # 映射模型backref = 'to_course', # 反向映射字段,反向映射表通过该字段查询当前表) # 映射表字段class Teacher(BaseModel):"""老师表老师与课程是多对一"""__tablename__ = "teacher"name = db.Column(db.String(32))age = db.Column(db.Integer)gender = db.Column(db.String(32))course_id = db.Column(db.Integer,db.ForeignKey("course.id"))# c = Course()
# c.name = "python"
# c.description = "人生苦短"
# c.save()
#
# t = Teacher()
# t.name = "李老师"
# t.age = 18
# t.gender = "男"
# t.course_id = c.id
# t.save()# 使用反向映射字段,查询当前老师所授课程(因为老师只能授一门课程,所以结果为一条数据)
t = Teacher.query.get(1)
print(t.to_course) # <Course 1>
# 使用反向映射字段,查询当前课程的授课老师(因为课程老师为一对多,所以结果为列表)
c = Course.query.get(1)
print(c.to_teacher) # [<Teacher 1>]
多对多关系反向映射
多对多关系的中间表在sqlalchemy当中只用于维护数据关系,本身内部的数据无法用反向映射查出来。
flask-sqlalchemy 数据库多对多映射表不可以是class类定义表,只能是Table设置的虚表。
class Student(BaseModel):"""学员表"""__tablename__ = "student"name = db.Column(db.String(32))age = db.Column(db.Integer)gender = db.Column(db.Integer,default = 13) #0 男 1女 -1 unknownStudent_Course = db.Table("student_course",db.Column("id", db.Integer, primary_key=True, autoincrement=True),db.Column("course_id", db.Integer, db.ForeignKey("course.id")),db.Column("student_id", db.Integer, db.ForeignKey("student.id"))
)class Course(BaseModel):"""课程表"""__tablename__ = "course"name = db.Column(db.String(32))description = db.Column(db.Text)to_teacher = db.relationship("Teachers", #映射表backref = "to_course" #反向映射字段,反向映射表通过该字段查询当前表内容) #指向映射表字段to_student = db.relationship("Student",# 映射模型secondary = Student_Course,# 第二映射的模型,关系表backref = db.backref("to_course",lazy = "dynamic"),# 反向映射字段,反向映射表通过该字段查询当前表lazy = "dynamic"#select 访问该字段时候,加载所有的映射数据#joined 对关联的两个表student和student_course进行join查询#dynamic 不加载数据)
models.drop_all()
models.create_all()
#定义两个课程
course = Course()
course.name = "python"
course.description = "python"
course.save()course1 = Course()
course1.name = "php"
course1.description = "php"
course1.save()
#定义两个学员
s = Students()
s.name = "小明"
s.age = 18
s.gender = "男
s.save()s1 = Students()
s1.name = "小刘"
s1.age = 19
s1.gener = "男"
s1.save()#保存关联
s.to_course = [course]
s.save()
s1.to_course = [course,course1]
s1.save()#查询id为1的学员的所有课程
student = Students.query.get(1)
print(student.to_course.all())
#查询学习id为2的课程的所有学员
coures = Course.query.get(2)
print(coures.to_student.all())
Flask数据库模型之数据库模型关系反向映射(四)相关推荐
- hibernate中一对多关系的映射
昨天初次接触hibernate,仅仅弄懂了一对一关系的映射.今天学习了一天又有了新的收获,弄懂了一对多之间关系的映射. 一.一对多的关系映射 建立一对多关系关系的表的原则是将一的一方的主键加入到多的一 ...
- 如何使用DNS反向映射来扫描IPv6地址?
目前增加的IPv6地址空间不仅提高了对启发式算法的使用(执行IPv6地址扫描时),而且还推动了人们探索替代技术用于查找IPv6节点.本文中我们将探讨如何使用一种极其强大的向量来发现IPv6节点:使用D ...
- Linux内存管理:反向映射机制(匿名页,文件页和ksm页)
目录 1.反向映射的发展 2.反向映射应用场景 3.匿名页的反向映射 4.文件页的反向映射 5.ksm页的反向映射 6.总结 7.作者简介 8.推荐阅读 为了系统的安全性,Linux内核将各个用户进程 ...
- [内核内存] 反向映射详解
文章目录 1 匿名页反向映射 1.1 匿名页反向映射关键数据结构 1.2 linux匿名页的反向映射机制 1.3 进程创建时反向映射相关结构体间的关系 1.4 linux为匿名页的VMA分配AV的流程 ...
- linux内存管理-反向映射
反向映射的需求 正向映射是通过虚拟地址根据页表找到物理内存,反向映射就是通过物理地址找到哪些虚拟地址使用它. 什么时候需要进行反向映射呢?在页面回收的时候,在还没有修改完所有引用该页帧的页表项之前是不 ...
- linux内存的反向映射
内存的反向映射 前言 文件页的反向映射 匿名页的反向映射 当VMA和VA首次相遇 在fork的时候,匿名映射的VMA经历了什么 构建三层大厦 page frame是如何加入"大厦" ...
- java反向映射_opencv 直方图和直方图反向映射
histogram 使用np进行直方图像素统计 通过histogram对图像的三个通道分别进行一维直方图统计,由于被统计的数组必须是一维的,所以使用ravel将二维数组转换为一维数组,通过range参 ...
- Linux 匿名页的反向映射
我们知道LINUX的内存管理系统中有"反向映射"这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Mi ...
- java反向映射_推荐一款Java对象映射神器,别再傻傻手动转换了!
点击蓝色字免费订阅,每天收到这样的好信息 前言:最近有不少粉丝关注本公众号.并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧.大家想买什 ...
最新文章
- 开源前后端分离在线考试系统
- 网站优化期间有哪些细节需要注意?
- get请求乱码问题,用encodeURI和decodeURI
- 如何优雅的处理业务逻辑中的定时和延时问题?
- 24、SQL注入是什么,如何避免SQL注入?
- 利用Freesbie制作FreeBSD livecd (2008/1/20)[zt]
- 关于file的部分简单命令
- 中柏平板u盘启动_大冶深圳东莞平板硫化机推选得新科技自动化
- 真正的问题应该在我身上……
- abaqus在岩土工程中的应用_什么是岩土锚固,看看在深基坑支护中如何应用
- 【codevs2144】砝码称重2,哈希什么的都去死吧
- Android安全防护之旅---Android应用反调试操作的几种方案解析
- python进行英语文献翻译
- RGB888颜色码与十六位(RGB565)颜色码的转换
- 基于SpringBoot+SpringSecurity+JWT+RSA加密算法签名 Auth权限认证搭建教程
- php 开源 采集,poscms火车采集教程
- 设置mysql数据库为只读
- 腾讯云运维tca题库
- 量化交易alpha、beta、shape等基本概念梳理
- 4. DBSCAN方法及其应用
热门文章
- Zookeeper原理详解
- IA32-Linux地址转换过程
- cocos studio 3.10 垂死挣扎版1.1 发布啦,带使用视频
- 迅为RK3568开发板实现的NVR/XVR方案
- 初步认识一下余弦定理余余弦相似度
- 牛奶可乐经济学之Q6:为什么有不少学校要求学生穿校服?
- 谈区块链技术在积分领域的应用
- 【算法】leetcode 974. 和可被 K 整除的子数组(前缀和思想)
- 无名前端的10年前端路~
- android broadcast 大全,android 动作、广播、类别等标识大全(Android actions, broadcasts, categories, etc.).doc...