在SQLAlchemy中访问联接查询结果

Dig*_*tal 2 python django sqlalchemy flask-sqlalchemy

如果我有:

query = db.session.query(Food, Person).filter(Food.id == Person.favourite_food)
for row in db.session.execute(query)
    print row
Run Code Online (Sandbox Code Playgroud)

我得到的第一个打印的输出是:

(1, u'Alice', 25, u'F', u'z', None, False, 1, u'icecream', 1, None, False)
(5, u'Bob', 38, u'M', u'z', None, False, 3, u'pizza', 1, None, False)
Run Code Online (Sandbox Code Playgroud)

我该怎么做:

print row.name, row.gender # <-- how do I do this?
Run Code Online (Sandbox Code Playgroud)

结果似乎不再具有列名。

编辑:还有一种方法可以只用一行来序列化查询结果,就像

return Response(json.dumps(query.results), mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)

小智 6

当您指定

    query(Food, Person)
Run Code Online (Sandbox Code Playgroud)

结果行将为sqlalchemy.util._collections.result类型,并且将具有两个字段:Food和Person

Food部分可以通过row [0]或row引用。FoodPerson部分可以通过row [1]或row.Person引用

所以例如

    print(row.Person.name, row.Person.gender) # works
    print(row[1].name, row[1].gender) # also works
Run Code Online (Sandbox Code Playgroud)

如果只需要特定的字段,则可以在查询中指定它们,例如:

    query = (db.session.query(Person.name, Person.gender, Food.name.label('foodname'))
             .filter(Food.id == Person.favourite_food))
Run Code Online (Sandbox Code Playgroud)

然后该对象将具有3个字段:姓名,性别,食品名

    print(row.name, row.gender, row.foodname)
Run Code Online (Sandbox Code Playgroud)