zoukankan      html  css  js  c++  java
  • SQLAlchemy中表结构的一对一

    1.先导入相对应的库

    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:zengsf@localhost:3306/flask"
    # 采用自动提交方式
    app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
    db = SQLAlchemy(app)

    2.先创建两个数据库类,例如创建LOL与DATA2这两个类

    LOL与DOTA2表进行外键关联,DOTA2都有一个lol_id字段。

    class LOL(db.Model):
        # 创建表名为
        __tablename__ = "lol"
        # 创建字段
        id = db.Column(db.Integer, primary_key=True)
        lname = db.Column(db.String(30), nullable=False)
        # 增加关联属性以及反向引用属性
        data = db.relationship("DOTA2", backref = "lol", uselist=False)
    
        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

    3.上面这些还没有完成创建数据库,还需要有数据库的创建

    db.create_all()

    4.接着先往两张表里添加数据,在浏览器中运行指定的路径就可以添加数据。

    @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==1).first()
        dota2data.lol_id = lol.id
        db.session.add(dota2data)
        print(db.session.query(DOTA2).all())
        return "OK"

    5.数据添加成功之后,可以通过正向引用或者反向引用来获取到相对应的名字

    @app.route('/query')
    def query_view():
        # 正向引用,通过LOL表进行查询,获取对象,在利用对象调用关联属性得到DOTA2表关联的对象,在获取里面的值。
        # lol = LOL.query.filter_by(id=1).first()
        # data = lol.data
    
        # 反向引用,通过DOTA2表进行查询,获取对象,在利用对象调用反向引用属性获取到LOL表关联对象,获取里面的值
        dota2 = DOTA2.query.filter_by(id=1).first()
        data = dota2.lol
    
        return "lol:%s,dota2:%s" % (data.lname, dota2.dname)

    6.由于代码是从上一直往下写的,最后别忘了调用

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

    7.在浏览器中输出结果是:

    lol:小炮,dota2:狙击手

  • 相关阅读:
    Selenium(三)webdriver的API与定位元素
    代码验证和动手动脑
    课程作业01实验报告1,2,3
    动手动脑
    课程作业03实验报告
    课程作业02实验报告
    猜数字实验报告
    java各种问题总结和一些讨论
    java从命令行接受多个数字并求和
    java登陆界面实验报告
  • 原文地址:https://www.cnblogs.com/zengsf/p/9898291.html
Copyright © 2011-2022 走看看