我是靠谱客的博主 安详过客,最近开发中收集的这篇文章主要介绍【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对象的属性,这样就能在实际开发中使逻辑关系更加清晰,代码更加简洁了。

一对一

  1. 一对一需要设置relationship中的uselist=Flase,其他数据库操作一样。

多对多

例子:关注的人和被关注的人

  1. 多对多关系可以先拆解为两个基本的一对多关系

补充SQLAlchemy中的关系选项

选项名说明
backref在关系的另一个模型中添加反向引用
primaryjoin明确指定两个模型之间使用的联结条件。只在模棱两可的关系中需要指定
lazy指定如何加载相关记录
lazy功能
select首次访问时按需加载
immediate源对象加载后就加载
joined加载记录,但使用联结
subquery立即加载,但使用子查询
noload永不加载
dynamic不加载记录,但提供加载记录的查询
  1. lazy="dynamic"只可以用在一对多和多对对关系中,不可以用在一对一和多对一中
  2. lazy决定了 SQLAlchemy什么时候从数据库中加载数据
  3. backreflazy默认都是select
  4. select就是访问到属性的时候,就会全部加载该属性的数据
  5. dynamic则不一样,在访问属性的时候,并没有在内存中加载数据,而是返回一个query对象, 需要执行相应方法才可以获取对象,比如.all().

参考链接:
[1] 知乎:遇到一个问题,请各位给讲解一下SQLAlchemy中的backref?
[2] 博客:flask-sqlalchemy中的lazy的解释

最后

以上就是安详过客为你收集整理的【Flask SQLAlchemy】一对多、多对多一对多一对一多对多补充SQLAlchemy中的关系选项的全部内容,希望文章能够帮你解决【Flask SQLAlchemy】一对多、多对多一对多一对一多对多补充SQLAlchemy中的关系选项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部