关系型数据库都有外键这个功能,但这个功能不是放在哪里都是有利的,有很多时候反而会使事情变得复杂。我就不喜欢使用外键,这是性格问题;实际工作中的系统也从不用外键,这是视系统性质及环境而定的。


在学习Flask的过程中,发现使用SQLAlchemy关联查询多表时,网上给出的教程、文档之类的都是基于外键(使用releationship和ForeginKey)的,不是很想用这些方法。


经过一轮摸索,还是找到了不需要外键,使用SQLAlchemy关联查询任意多个表的方法,代码如下:

#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)


运行这段代码,就可以在控制台看到输出的结果:

wKiom1SeYe_SOzSQAAIkRG_j9CU020.jpg



可以看到,SQLAlchemy生成的SQL语句就进行了一个关联查询,并且查询得到的结果分别放在了对应表的模型类里面,只要分别访问这个两类就可以访问到关联查询得到的每一个字段的值。