1. 程式人生 > >SQLAlchemy中表結構的一對多

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:[email protected]: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:風行者