SQLAlchemy中表结构的一对多

Posted zengsf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:[email protected]: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:风行者

 

以上是关于SQLAlchemy中表结构的一对多的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy外键的使用

在sqlalchemy中插入具有一对多关系的新记录

SQLAlchemy 一对多关系澄清

嵌套的一对多关系 sqlalchemy 过滤

如何级联删除一对多数据 sqlalchemy

flask-sqlalchemy 一对一,一对多,多对多操作