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:风行者
  • 相关阅读:
    浏览器行为:Form表单提交
    js中new到底做了什么?如何重写new?
    vue与react对比
    关于css中touch-action属性 在移动端开发中遇到的问题
    国际化:node导语言包
    django 开发忘记密码通过邮箱找回功能
    django 通过ajax完成邮箱用户注册、激活账号
    django 通过ajax完成登录
    django 通过邮箱和用户名都能登录
    django引入模板时,部分css文件渲染不成功失灵引入不成功
  • 原文地址:https://www.cnblogs.com/zengsf/p/9900144.html
Copyright © 2011-2022 走看看