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

2022-09-28 16:42:45 浏览数 (2)

前言

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

一对一模型设计

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

代码语言:javascript复制
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表

新增数据

两张表数据一起创建

代码语言:javascript复制
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

代码语言:javascript复制
stu = Student.query.filter_by(name='yoyo2').first()
# 查询关联表
print(stu.contact.address)  # 上海市

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

代码语言:javascript复制
con = Contact.query.filter_by(address='上海市').first()
print(con.student.name)  # yoyo2

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

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

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

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

联系微信/QQ:283340479

0 人点赞