• Flask 学习77.FlaskSQLAlchemy 一对一关系增删改查 上海


    前言

    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'参数关联起来。

  • 相关阅读:
    2019/1/17 break语句小练习
    2019/1/17goto语句小试牛刀
    python 中* 和**的作用
    python 元组编码和解码问题
    python SMTP 发送邮件
    python 自定义异常
    python websocket client 使用
    excel、xls文件读写操作
    windows10局域网实现文件共享
    django入门
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16723108.html
Copyright © 2020-2023  润新知