我正在编写Web api,该API传递通过SQL Alchemy查询的SQL响应。我想使用源表检索查询的列名。
这里是例子:
fields = [
StudentsTable.name,
SubjectsTable.name
]
query = self.session()\
.query(*fields)\
.filter(StudentsTable.id_some_fk == SubjectsTable.id_some_pk)
return {
"meta": {
"fields": query.column_descriptions
},
"data": query.all()
}
“ fields”变量将是动态的,例如。用户将能够将其作为字符串列表传递,并且我希望得到SQLAlchemy的统一响应,而不是通过迭代fields变量来实现。
有了这个 query.column_descriptions ,我得到了预期的列名。但是,这些只是列名,而没有源表名。因此,在这种情况下,我同时获得了“名称”列和“名称”列,我不确定是哪个名称。
{
"meta": {
"fields": [
{
"name": "name",
"type": null,
"aliased": false,
"expr": null,
"entity": null
},
{
"name": "name",
"type": null,
"aliased": false,
"expr": null,
"entity": null
}
]
},
"data": []
}
答案 0 :(得分:1)
与表相对应的类位于“实体”键中。因此,如果您想在字段哈希中使用“表名”键,则可以执行以下操作:
fields = [
StudentsTable.name,
SubjectsTable.name
]
query = self.session()\
.query(*fields)\
.filter(StudentsTable.id_some_fk == SubjectsTable.id_some_pk)
descriptions = query.column_descriptions
for description in descriptions:
description['tablename'] = description['entity'].__tablename__
return {
"meta": {
"fields": descriptions
},
"data": query.all()
}
当然,您的问题是退货为空,至少在已过帐的退货中。根据您的实际ORM和数据库数据,这可能有不同的原因。
如果相反,您希望列名前面加上表名,则可以将上面的for循环更改为
for description in descriptions:
description['name'] = "{}.{}".format(description['entity'].__tablename__, description['name'])
答案 1 :(得分:0)
在这种情况下,使用标签可能会有所帮助。例如
fields = [
StudentsTable.name.label('student_name'),
SubjectsTable.name.label('subject_name')
]