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:狙击手

原文地址:https://www.cnblogs.com/zengsf/p/9898291.html