前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask 学习-78.Flask-SQLAlchemy 一对多关系

Flask 学习-78.Flask-SQLAlchemy 一对多关系

作者头像
上海-悠悠
发布2022-09-28 16:42:40
9560
发布2022-09-28 16:42:40
举报
文章被收录于专栏:从零开始学自动化测试

前言

一个人有多个收件地址,这就是一对多关系

一对多(one-to-many)关系

关系使用 relationship() 函数表示。然而外键必须用类 sqlalchemy.schema.ForeignKey 来单独声明:

代码语言:javascript
复制
class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

db.relationship() 做了什么? 这个函数返回一个可以做许多事情的新属性。在本案例中,我们让它指向 Address 类并加载多个地址。它如何知道会返回不止一个地址? 因为 SQLALchemy 从您的声明中猜测了一个有用的默认值。如果您想要一对一关系,您可以把 uselist=False 传给 relationship() 。

那么 backref 和 lazy 意味着什么了? backref 是一个在 Address 类上声明新属性的简单方法。您也可以使用 my_address.person 来获取使用该地址(address)的人(person)。 lazy 决定了 SQLAlchemy 什么时候从数据库中加载数据:

  • ‘select’ (默认值) 就是说 SQLAlchemy 会使用一个标准的 select 语句必要时一次加载数据。
  • ‘joined’ 告诉 SQLAlchemy 使用 JOIN 语句作为父级在同一查询中来加载关系。
  • ‘subquery’ 类似 ‘joined’ ,但是 SQLAlchemy 会使用子查询。
  • ‘dynamic’ 在有多条数据的时候是特别有用的。不是直接加载这些数据,SQLAlchemy 会返回一个查询对象,在加载数据前您可以过滤(提取)它们。

如何为反向引用(backrefs)定义惰性(lazy)状态?使用 backref() 函数:

代码语言:javascript
复制
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address',
        backref=db.backref('person', lazy='joined'), lazy='dynamic')

新增数据

主表和关联表同时创建数据

代码语言:javascript
复制
    person = Person(name='yoyo')
    person.addresses = [
        Address(email='123@qq.com')
    ]
    db.session.add(person)
    db.session.commit()  # 提交

如果先创建了person表数据

代码语言:javascript
复制
person = Person(name='yoyo1')
db.session.add(person)
db.session.commit()  # 提交

关联表根据查询对象再添加关联数据

代码语言:javascript
复制
    person = Person.query.filter_by(name='yoyo1').first()
    address = [
        Address(email='123@qq.com', person_id=person.id),
        Address(email='222@qq.com', person_id=person.id),
    ]
    db.session.add_all(address)
    db.session.commit()  # 提交

2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!

本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00

报名费:报名费3000一人(周期3个月)

联系微信/QQ:283340479

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一对多(one-to-many)关系
  • 新增数据
    • 报名费:报名费3000一人(周期3个月)
      • 联系微信/QQ:283340479
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档