我是靠谱客的博主 安详过客,最近开发中收集的这篇文章主要介绍【Flask SQLAlchemy】一对多、多对多一对多一对一多对多补充SQLAlchemy中的关系选项,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一对多
要弄清楚多对多,先搞清楚一对多。因为这样便于后面可以更好地理解
例子:父亲和孩子(一个父亲可以有多个孩子,一个孩子只有一个父亲)
class Father(db.Model): # 我是爸爸
id = db.Column(db.Integer, primary_key=True) # 这是我的号码
name = db.Column(db.String(30), unique=True) # 这是我的名字
# 我有一些孩子登记在Children表上。
# Children表上面的每一个children都可以通过.father找到我。
# backref是我给孩子们的名片(上面是号码)。
children = db.relationship("Children", backref="father")
def __init__(self, name):
self.name = name
def __repr__(self):
return ‘<name is %r>' % self.name
class Children(db.Model): # 我是孩子
id = db.Column(db.Integer, primary_key=True) # 这是我的号码
name = db.Column(db.String(30), unique=True) # 这是我的名字
# 我拿着爸爸的号码
father_id = db.Column(db.Integer, db.ForeignKey('father.id'))
def __init__(self, name):
self.name = name
def __repr__(self):
return '<name is %r>' % self.name
这样一来,father.children可以访问这位父亲的孩子,child.father可以访问自己的父亲。
- 当我们需要在父表中添加子表关系时使用 relationship,外键通常是父表的主键
relationship
函数是sqlalchemy对关系之间提供的一种便利的调用方式backref
参数则对关系提供反向引用的声明。backref
的大致原理应该就是sqlalchemy在运行时对Children对象动态的设置了一个指向所属Father对象的属性,这样就能在实际开发中使逻辑关系更加清晰,代码更加简洁了。
一对一
- 一对一需要设置relationship中的uselist=Flase,其他数据库操作一样。
多对多
例子:关注的人和被关注的人
- 多对多关系可以先拆解为两个基本的一对多关系
补充SQLAlchemy中的关系选项
选项名 | 说明 |
---|---|
backref | 在关系的另一个模型中添加反向引用 |
primaryjoin | 明确指定两个模型之间使用的联结条件。只在模棱两可的关系中需要指定 |
lazy | 指定如何加载相关记录 |
lazy | 功能 |
---|---|
select | 首次访问时按需加载 |
immediate | 源对象加载后就加载 |
joined | 加载记录,但使用联结 |
subquery | 立即加载,但使用子查询 |
noload | 永不加载 |
dynamic | 不加载记录,但提供加载记录的查询 |
lazy="dynamic"
只可以用在一对多和多对对关系中,不可以用在一对一和多对一中lazy
决定了SQLAlchemy
什么时候从数据库中加载数据backref
的lazy
默认都是select
select
就是访问到属性的时候,就会全部加载该属性的数据dynamic
则不一样,在访问属性的时候,并没有在内存中加载数据,而是返回一个query
对象, 需要执行相应方法才可以获取对象,比如.all()
.
参考链接:
[1] 知乎:遇到一个问题,请各位给讲解一下SQLAlchemy中的backref?
[2] 博客:flask-sqlalchemy中的lazy的解释
最后
以上就是安详过客为你收集整理的【Flask SQLAlchemy】一对多、多对多一对多一对一多对多补充SQLAlchemy中的关系选项的全部内容,希望文章能够帮你解决【Flask SQLAlchemy】一对多、多对多一对多一对一多对多补充SQLAlchemy中的关系选项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复