Flask 学习-77.Flask-SQLAlchemy 一对一关系增删改查

前言

SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关系。

一对一模型设计

有个Student 记录学生基本信息,Contact表记录学生联系方式,Student和Contact是一对一关系。


class Student(db.Model):
    __tablename__ = 'student'  # 数据库表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True, nullable=False)
    gender = db.Column(db.Enum("男", "女"), default=None, nullable=True)
    contact = db.relationship(
        'Contact', uselist=False, backref='student'
    )
    def save(self):
        """保存数据"""
        db.session.add(self)
        db.session.commit()


class Contact(db.Model):
    __tablename__ = 'contact'  # 数据库表名
    id = db.Column(db.Integer, primary_key=True)
    tel = db.Column(db.String(20), nullable=True)
    address = db.Column(db.String(150), nullable=True)
    user_id = db.Column(db.Integer, db.ForeignKey('student.id'))

    def save(self):
        """保存数据"""
        db.session.add(self)
        db.session.commit()

同步后生成student表

生成contact表

新增数据

两张表数据一起创建

from flask_restx import Namespace, Resource, fields, reqparse, marshal_with


api = Namespace('api', description='项目接口')
from apis import db
from .models import Student, Contact

@api.route('/add')
class StudentView(Resource):

    def post(self):
        """新增"""
        stu = Student(name='yoyo2')
        db.session.add(stu)
        db.session.flush()  # flush方法会生成Primary Key 得到card  的 id
        detail = Contact(address='上海市', user_id=stu.id)
        db.session.add(detail)
        db.session.commit()  # 提交
        return {"msg": "ok"}

创建成功

查询

正向查询:通过 Student 表查询关联表 Contact

stu = Student.query.filter_by(name='yoyo2').first()
# 查询关联表
print(stu.contact.address)  # 上海市

反向查询:通过 Contact 表反向查询 Student

con = Contact.query.filter_by(address='上海市').first()
print(con.student.name)  # yoyo2

反向查询是通过backref='student'参数关联起来。

posted @ 2022-09-23 21:41  上海-悠悠  阅读(233)  评论(0编辑  收藏  举报