【Flask 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的解释

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值