關係型數據庫都有外鍵這個功能,但這個功能不是放在哪裏都是有利的,有不少時候反而會使事情變得複雜。我就不喜歡使用外鍵,這是性格問題;實際工做中的系統也從不用外鍵,這是視系統性質及環境而定的。
python
在學習Flask的過程當中,發現使用SQLAlchemy關聯查詢多表時,網上給出的教程、文檔之類的都是基於外鍵(使用releationship和ForeginKey)的,不是很想用這些方法。mysql
通過一輪摸索,仍是找到了不須要外鍵,使用SQLAlchemy關聯查詢任意多個表的方法,代碼以下:sql
#coding=utf-8 from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123@localhost:3306/tt' db = SQLAlchemy(app) #建表模型 class Test(db.Model): id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(32)) class TestItems(db.Model): id = db.Column(db.Integer, primary_key = True) test_id = db.Column(db.Integer) #應用,在瀏覽器訪問http://localhost/test/ @app.route('/test/') def test(): query = db.session().query(models.TestItems, models.Test) query = query.join(models.Test, models.Test.id == models.TestItems.test_id) #query = query.filter('test.id = 1') #query = query.order_by('test.id') print query data = query.all() print dir(data[0]) print data[0].Test.name #for row in data: # print row.Test.name return 'OK' if __name__ == '__main__': db.create_all() app.run(port = 80, debug = True)
運行這段代碼,就能夠在控制檯看到輸出的結果:
數據庫
能夠看到,SQLAlchemy生成的SQL語句就進行了一個關聯查詢,而且查詢獲得的結果分別放在了對應表的模型類裏面,只要分別訪問這個兩類就能夠訪問到關聯查詢獲得的每個字段的值。flask