获取列名称以及表名称以进行SQLAlchemy查询

时间:2019-08-27 16:22:41

标签: python sqlalchemy

我正在编写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": []
}

2 个答案:

答案 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')
]