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:风行者