Python 获取SQLAlchemy查询的列名和表名

Python 获取SQLAlchemy查询的列名和表名,python,sqlalchemy,Python,Sqlalchemy,我正在编写web 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":

我正在编写web 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\u描述,我得到了预期的列名。但是,这些只是列名,没有源表名。所以,在本例中,我得到了两个“name”列,我不确定它是哪个名称

{
    "meta": {
        "fields": [
            {
                "name": "name",
                "type": null,
                "aliased": false,
                "expr": null,
                "entity": null
            },
            {
                "name": "name",
                "type": null,
                "aliased": false,
                "expr": null,
                "entity": null
            }
        ]
    },
    "data": []
}

在这种情况下,使用标签可能会有所帮助。比如说

fields = [
    StudentsTable.name.label('student_name'),
    SubjectsTable.name.label('subject_name')
]

与表对应的类位于“entity”键中。因此,如果要在字段哈希中使用“tablename”键,可以执行以下操作:

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

这正是我需要的东西。谢谢!如果I字段不可由用户更改,那么这将是很好的,不管它们是如何更改的。无论如何,谢谢你。