SQLAlchemy中表结构的一对多

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()

app = Flask(__name__)
# 连接数据库
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@localhost:3306/flask"
# 采用自动提交方式
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
db = SQLAlchemy(app)


class LOL(db.Model):
    # 创建表名为
    __tablename__ = "lol"
    # 创建字段
    id = db.Column(db.Integer, primary_key=True)
    lname = db.Column(db.String(30), nullable=False)
    # 增加关联属性以及反向引用属性
    # 这里一对一是uselist = False,这里的是lazy
    data = db.relationship("DOTA2", backref="lol", lazy="dynamic")

    def __init__(self, lname):
        self.lname = lname

    def __repr__(self):
        return "<LOL:%r>" % self.lname


class DOTA2(db.Model):
    __tablename__ = "dota2"
    id = db.Column(db.Integer, primary_key=True)
    dname = db.Column(db.String(30))
    # 增加一个列(外键):表示引用自LOL表的外键
    lol_id = db.Column(db.Integer, db.ForeignKey("lol.id"))

    def __init__(self, dname):
        self.dname = dname

    def __repr__(self):
        return "<DOTA2:%r>" % self.dname


db.create_all()

@app.route('/')
def hello_world():
    return 'Hello World!'


@app.route('/lol')
def lol_view():
    loldata = LOL("三只手")
    db.session.add(loldata)
    print(db.session.query(LOL).all())
    return "OK"


@app.route("/dota2")
def dota2_view():
    dota2data = DOTA2("电棍")
    lol = db.session.query(LOL).filter(LOL.id==3).first()
    dota2data.lol_id = lol.id
    db.session.add(dota2data)
    print(db.session.query(DOTA2).all())
    return "OK"


@app.route('/query')
def query_view():
    # 正向关联查找,由于是一对多,因此查询到要查找的“一”,然后在利用正向关联,获取到dota2表中的“多”
    # 返回一个对象
    lol = LOL.query.filter_by(id=2).first()
    print(lol)
    dotas = lol.data.all()
    for dota in dotas:
        print("lol:%s,dota2:%s" % (lol.lname, dota.dname))

    # 反向关联查找,利用外键字段的一个值,将所有符合的英雄取出来,由于是把所有对象放在一个列表,因此进行循环遍历
    # dota2s = DOTA2.query.filter_by(lol_id=2).all()
    # for dota2 in dota2s:
    #     # 利用对象调用反向关联属性,得到lol表中关联对象,因此再取值
    #     data = dota2.lol
    #     print("lol:%s,dota2:%s" % (data.lname, dota2.dname))
    return "OK"

if __name__ == '__main__':
    app.run(debug=True)

输出结果:

lol:EZ,dota2:小黑
lol:EZ,dota2:风行者
原文地址:https://www.cnblogs.com/zengsf/p/9900144.html