zoukankan      html  css  js  c++  java
  • 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:风行者
  • 相关阅读:
    JOISC2017 手持ち花火 (Sparklers) 题解
    Codeforces 1427E. Xum 题解
    AGC027D
    Codeforces 1416F. Showing Off 题解
    AGC032F
    AGC019E
    TCP实验(前言)
    OS第一次实验截图
    第12组 Beta (2/6)(丁泽中)
    第12组 Beta (1/6)(丁泽中)
  • 原文地址:https://www.cnblogs.com/zengsf/p/9900144.html
Copyright © 2011-2022 走看看