首页 > 数据库 >Flask 学习-78.Flask-SQLAlchemy 一对多关系

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

时间:2022-09-26 09:35:49浏览次数:70  
标签:SQLAlchemy Flask db Column person Address id 78

前言

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

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

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

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() 函数:

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')

新增数据

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

    person = Person(name='yoyo')
    person.addresses = [
        Address(email='[email protected]')
    ]
    db.session.add(person)
    db.session.commit()  # 提交

如果先创建了person表数据

person = Person(name='yoyo1')
db.session.add(person)
db.session.commit()  # 提交

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

    person = Person.query.filter_by(name='yoyo1').first()
    address = [
        Address(email='[email protected]', person_id=person.id),
        Address(email='[email protected]', person_id=person.id),
    ]
    db.session.add_all(address)
    db.session.commit()  # 提交

标签:SQLAlchemy,Flask,db,Column,person,Address,id,78
From: https://www.cnblogs.com/yoyoketang/p/16729771.html

相关文章

  • 788. 旋转数字
    解题思路利用前面已经求出的数来判断后续数据是否为好数,将现在要查的数分为前面几位和最后一位约规0、1、8为普通数,在pd中为0,而2、5、6、9为好数,在pd中为1,而其余为坏......
  • 使用pychrm编写第一个Flask Web程序
    使用pychrm编写第一个FlaskWeb程序fromflaskimportFlaskapp=Flask(__name__)#实例化类[email protected]('/')#装饰器操作,实现URL地址defhello():......
  • 「浙江理工大学ACM入队200题系列」问题 E: 零基础学C/C++78——求奇数的乘积
    本题是浙江理工大学ACM入队200题第七套中的E题(大概)我们先来看一下这题的题面.题面输入输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据......
  • sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2026, '
    sqlalchemy.exc.OperationalError:(MySQLdb._exceptions.OperationalError)(2026,'SSLconnectionerror:unknownerrornumber')问题:使用sqlalchemy查询mysql数据时......
  • Flask 学习-77.Flask-SQLAlchemy 一对一关系增删改查
    前言SQLAlchemy连接到关系型数据库,关系型数据最擅长的东西就是关系。一对一模型设计有个Student记录学生基本信息,Contact表记录学生联系方式,Student和Contact是一对一......
  • 基于SX1278/SX1276芯片的LoRa技术知识详解
    载波频率:载波频率就是没有调制数据的纯射频信号,用来载送信号的频率,在这个频率的基础上进行移频键控的调制输出无线信号,通常说发射频率就是指载波频率。lora扩频因子:扩频......
  • 题解 P7870 「Wdoi-4」兔已着陆
    不用真的模拟一个个的蛋糕。直接将一个区间压入栈中即可。取出来时,注意将断的区间一分为二重新塞入。#include<bits/stdc++.h>usingnamespacestd;#defineN1000010......
  • Flask 学习-74.Flask-RESTX 查询参数args 校验
    前言通过api.model()设置的模型,只能校验post请求的json格式,无法设置location参数校验get请求的查询参数遇到的问题当我访问一个分页查询地址/teacher?page=1&size=3需......
  • flask MongoDB 很好例子
    逻辑图代码#fromcollectionsimportnamedtuplefromflaskimportFlask,make_response,jsonify,requestfromflask_mongoengineimportMongoEngine#fromapi_co......
  • P1078 [NOIP2012 普及组] 文化之旅
    https://www.luogu.com.cn/problem/P1078搜索,图论,剪枝,最短路绿色题思路一:搜索1.输入,建边,用一个数组存储已经学习的文化,2.搜索,以当前的点now去看能走到哪些边,......