【问题标题】:Accessing join query results in SQLAlchemy在 SQLAlchemy 中访问连接查询结果
【发布时间】:2016-07-02 02:53:26
【问题描述】:

如果我有:

query = db.session.query(Food, Person).filter(Food.id == Person.favourite_food)
for row in db.session.execute(query)
    print row

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

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

我该怎么做:

print row.name, row.gender # <-- how do I do this?

结果似乎没有列名了。

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

return Response(json.dumps(query.results), mimetype='application/json')

【问题讨论】:

    标签: python django sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您可以以不同的方式执行查询:

    for row in query.all():
        print row[1].name, row[1].gender
    

    【讨论】:

    • 谢谢。有没有办法只用一行来序列化查询结果,比如 return Response(json.dumps(query.results), mimetype='application/json')
    • 你的意思是:answer = [(row[1].name, row[1].gender) for row in query.all()]
    【解决方案2】:

    当你指定时

        query(Food, Person)
    

    结果行的类型为 sqlalchemy.util._collections.result, 它将有两个字段:食物和人

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

    引用

    例如

        print(row.Person.name, row.Person.gender) # works
        print(row[1].name, row[1].gender) # also works
    

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

        query = (db.session.query(Person.name, Person.gender, Food.name.label('foodname'))
                 .filter(Food.id == Person.favourite_food))
    

    然后该对象将有 3 个字段:姓名、性别、食物名称

        print(row.name, row.gender, row.foodname)
    

    【讨论】:

    • 伙计,我找这个已经很久了。非常感谢
    猜你喜欢
    • 2021-02-21
    • 2018-03-04
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    相关资源
    最近更新 更多