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