Flask-SQLAlchemy relationship中的 lazy屬性
- select: 就是访问到属性的时候,就会全部加载该属性的数据
- joined: 对关联的两个表使用联接
- subquery: 与joined类似,但使用子子查询
- dynamic: 不加载记录,但提供加载记录的查询,也就是生成query对象
students = db.relationship('Student', backref='_class', lazy="dynamic")
backref=db.backref('students', lazy='dynamic')
??根據上面原則,那麼反向引用對向側即Class模型必須爲多的一側,而此時模型關系變爲多對多,多對多關系比較復雜,需要關聯表作爲中間表
registrations = db.Table('registrations',db.Column('student_id', db.Integer, db.ForeignKey('students.id')),db.Column('class_id', db.Integer, db.ForeignKey('classes.id')))class Student(db.Model):__tablename__ = 'students'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64))#class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))def __repr__(self):return '<Student: %r>' %self.nameclass Class(db.Model):__tablename__ = 'classes'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64))students = db.relationship('Student', secondary=registrations,backref='_class', lazy="dynamic")def __repr__(self):return '<Class: %r>' %self.name
# insert student and class many-to-many relationshipc1 = Class(id=1, name='class1') c2 = Class(id=2, name='class2') s1 = Student(id=1, name='susan') s2 = Student(id=2, name='bob') s3 = Student(id=3, name='may') c1.students = [s1, s3] c2.students = [s1, s2]#update db db.session.add_all([s1, s2, s3, c1, c2]) db.session.commit()
backref="_class"
默认仍然是select
,所以直接返回结果,而c1.students lazy屬性值爲dynamic依然是返回了query對象
students = db.relationship('Student', secondary=registrations,backref=db.backref('_class', lazy='joined'), lazy="dynamic")
同樣執行結果爲:
s1._class
还是直接返回数据。有变化的是c1.students
的sql语句
SELECT students.id AS students_id, students.name AS students_name, classes_1.id AS classes_1_id, classes_1.name AS classes_1_name FROM registrations, students LEFT OUTER JOIN (registrations AS registrations_1 INNER JOIN classes AS classes_1 ON classes_1.id = registrations_1.class_id) ON students.id = registrations_1.student_id WHERE %(param_1)s = registrations.class_id AND students.id = registrations.student_id
registrations
是直接被sqlalchemy
接管的,程序无法直接访问的。
lazy
方式的优势,我们把关联表改为实体model,并且额外增加一个时间信息。模型代码如下:
class Registration(db.Model):__tablename__ = 'registrations'student_id = db.Column(db.Integer, db.ForeignKey('students.id'), primary_key=True)class_id = db.Column(db.Integer, db.ForeignKey('classes.id'), primary_key=True)create_at = db.Column(db.DateTime, default=datetime.utcnow)class Student(db.Model):__tablename__ = 'students'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64))_classes = db.relationship('Registration', foreign_keys=[Registration.student_id],backref = db.backref('_student', lazy='joined'),lazy = 'dynamic')def __repr__(self):return '<Student: %r>' %self.nameclass Class(db.Model):__tablename__ = 'classes'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64))_students = db.relationship('Registration', foreign_keys=[Registration.class_id],backref=db.backref('_class', lazy='joined'),lazy='dynamic')def __repr__(self):return '<Class: %r>' %self.name
手動插入數據:
#insert student and classes many to many relationship c1 = Class(id=1, name='class1') c2 = Class(id=2, name='class2') s1 = Student(id=1, name='susan') s2 = Student(id=2, name='bob') s3 = Student(id=3, name='may') r1 = Registration(student_id=3, class_id=1) r2 = Registration(student_id=2, class_id=2) r3 = Registration(student_id=1, class_id=1) r4 = Registration(student_id=1, class_id=2)#update db db.session.add_all([s1, s2, s3, c1, c2, r1, r2, r3, r4]) db.session.commit()
查看表結構:
Student
和Class
对象了。如果想要获取的话,可以使用给Registration加的反向引用:
s1._class
不仅查询了对应的class
信息,而且通过join
操作,获取到了相应的Student
和Class
对象,换句话说,把Registration的_student和_class
两个回引属性均指向了对应的对象, 也就是说,s1._class
这一条查询语句就可以把上述操作都完成。这个就是backref=db.backref('_class', lazy='joined')
的作用。
lazy
改为select
的情况:
_students = db.relationship('Registration', foreign_keys=[Registration.class_id],backref=db.backref('_class', lazy='select'),lazy='dynamic')
_classes = db.relationship('Registration', foreign_keys=[Registration.student_id],backref = db.backref('_student', lazy='select'),lazy = 'dynamic')
Registration
对象, 虽然结果一样,但是每一个Registration
对象访问_class
属性时,又各自都查询了一遍数据库! 这是很重的! 比如一个class有100个student, 那么获取class.students
需要额外查询100次数据库! 每一次数据库的查询代价很大,因此这就是joined
的作用了。
flask-sqlalchemy中 backref lazy的参数实例解释和选择
SQLalchemy relationship之lazy属性 学习笔记
sqlalchemy中多对多的关系 - CSDN博客
Flask-SQLAlchemy relationship中的 lazy屬性相关推荐
- 善用 CSS 中的 table-layout 屬性加快 Table 的顯示速度
在很久以前我們都是用 Table 在排版的,我相信現在還是有不少人還是在用 Table 進行排版而非現在較為流行的 CSS 排版,使用 Table 排版最大的好處就是版面在各瀏覽器中顯示比較不會亂掉. ...
- python keyboard backspace_Python curses.KEY_BACKSPACE屬性代碼示例
本文整理匯總了Python中curses.KEY_BACKSPACE屬性的典型用法代碼示例.如果您正苦於以下問題:Python curses.KEY_BACKSPACE屬性的具體用法?Python c ...
- java中的terminated_Java State.TERMINATED屬性代碼示例
本文整理匯總了Java中java.lang.Thread.State.TERMINATED屬性的典型用法代碼示例.如果您正苦於以下問題:Java State.TERMINATED屬性的具體用法?Jav ...
- flask sqlalchemy一对多关系详解
下面的一对多关系以作者和文章为例: 首先创建一个文章表: class Post(db.Model): id = db.Column(db.Integer(),primary_key=True) tit ...
- python学习之flask sqlalchemy介绍和使用 表操作增删查改
flask sqlalchemy介绍和使用 表操作增删查改 内容详细 1 sqlalchemy介绍和快速使用 1.1 介绍 # SQLAlchemy是一个基于Python实现的ORM框架# djang ...
- c# 一些控件常用屬性
Form: ControlBox:移除窗體按鈕(最大化.最小化.關閉組),並從左側移除「系統菜單」 Opacity:控制窗體透明度 ActiveControl:指出窗體上當前哪 ...
- bipush java,Java Opcodes.BIPUSH屬性代碼示例
本文整理匯總了Java中org.objectweb.asm.Opcodes.BIPUSH屬性的典型用法代碼示例.如果您正苦於以下問題:Java Opcodes.BIPUSH屬性的具體用法?Java O ...
- alchemy php,Flask SQLAlchemy
在Flask Web应用程序中使用原始SQL对数据库执行CRUD操作可能很乏味. 相反,Python工具包SQLAlchemy是一个功能强大的OR映射器,为应用程序开发人员提供了SQL的全部功能和灵活 ...
- Ios: 如何保護iOS束文件屬性列表,圖像,SQLite,媒體文件
Ios: 如何保護iOS束文件屬性列表,圖像,SQLite,媒體文件 我創建了Hello World示例項目,然後添加data.plist文件到資源文件夾.現在人們可以很容易得到束文件解壓縮.國際音標 ...
- 控制項學習四(屬性與事件)
四.初探控制項屬性(Property)的建立 1.當我們建立一個控制項(或類別),可以建立控制項的屬性(property),屬性多半是一個值,或是指到另外一個物件,或是一個集合. 請注意,在該屬性宣告 ...
最新文章
- 工厂用抽象类比接口_用简单的现实类比解释硬编码概念
- K8S 从懵圈到熟练--大数据平台技术栈18
- python的image读取的图片是什么类型的-python如何实现读取并显示图片(不需要图形界面)...
- doubleClick-v2-as3.0 学习笔记(2)--Video相关
- mysql server安装不成功,解决Mysql5.7.17在windows下安装启动时提示不成功问题
- 四十八、第二份国外的Python考试(下篇)
- mac 环境变量设置
- DiskFileItemFactory API详解
- python之用循环实现五子棋小程序
- 统计学第一章--最小二乘拟合正弦函数,正则化
- python两个字符串数据可以复制吗_无论如何,是否要将Python pandas数据框中的单个数据中的数据复制到字符串或列表中以进行进一步处理?...
- phpcmsV9一、二级导航栏目loop循环输出、当前高亮显示
- linux安装phpunit,linux下安装phpunit
- 【单片机基础篇】共阴级四位数码管
- SyncToy -- 微软同步工具
- 学生使用腾讯云搭建个人网站
- mysql实现分组查询每个班级的前三名、每门课程的前三名
- flutter-学习之发布安卓包APK
- Github每日精选(第17期):Django下的内容管理系统wagtail
- 树莓派4B + darknet-yolov4-tiny + 英特尔第二代神经计算棒
热门文章
- java jar apktool,apktool下载
- Linux下dislocate命令用法,技术|在 Linux 中遨游手册页的海洋
- java编程计算圆球的体积_已知圆球体积为4/3πr³,试编写一个程序,输入圆球半径,经过计算输出圆球的体积.用JAVA编写的...明天(3月11号)要用....
- 代理服务器的四大作用
- 计算机网络之数据链路层信道划分介质访问【408_3】
- ALOHA协议与CSMA协议
- 爬虫python下载电影_Python 爬虫实战:分析豆瓣中最新电影的影评
- ad中按钮开关的符号_电工必备基础知识及电路的符号字母大全
- 大秦帝国部:黑色裂变(上卷)读后感
- python输入数字输出月份英文缩写_英文和数字表示的月份,如何在 Excel 中相互转换?...