Python 金字塔/SQLAlchemy连接模型的问题

Python 金字塔/SQLAlchemy连接模型的问题,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,我对Python真的很陌生&对Pyramid也是陌生的(这是我用Python写的第一件事),在数据库查询方面遇到了麻烦 我有以下模型(与我的问题相关): MetadataRef(包含有关给定元数据类型的信息) 元数据(包含实际元数据)——这是MetadataRef的子级 用户(包含用户)——这是链接到元数据的。MetadataRef.model='User'和metadata.model\u id=User.id 我需要访问MetadataRef中的名称和元数据中的值 这是我的密码: cla

我对Python真的很陌生&对Pyramid也是陌生的(这是我用Python写的第一件事),在数据库查询方面遇到了麻烦

我有以下模型(与我的问题相关):

  • MetadataRef(包含有关给定元数据类型的信息)
  • 元数据(包含实际元数据)——这是MetadataRef的子级
  • 用户(包含用户)——这是链接到元数据的。MetadataRef.model='User'和metadata.model\u id=User.id
我需要访问MetadataRef中的名称和元数据中的值

这是我的密码:

class User(Base):
    ...
    _meta = None

    def meta(self):
        if self._meta == None:
            self._meta = {}
            try:
                for item in DBSession.query(MetadataRef.key, Metadata.value).\
                    outerjoin(MetadataRef.meta).\
                    filter(
                        Metadata.model_id == self.id,
                        MetadataRef.model == 'User'
                    ):
                    self._meta[item.key] = item.value

            except DBAPIError:
                #@TODO: actually do something with this
                self._meta = {}
        return self._meta
SQLAlchemy正在生成的查询确实返回了我所需要的结果(不管怎样已经足够接近了——它需要作为ON子句的一部分而不是WHERE查询model_id,但这是次要的,我很确定我自己可以解决):

但是,当我访问对象时,会出现以下错误:

AttributeError: 'KeyedTuple' object has no attribute 'metadata_value'
这让我想到还有其他方法可以访问它,但我不知道如何访问。我尝试了
.value
.metadata\u value
.key
按预期工作


有什么想法吗?

您正在查询单独的属性(“SA文档中启用ORM的描述符”):

在这种情况下,查询返回的不是完整的ORM映射对象,而是一个数组,它是元组和具有与字段的“标签”对应的属性的对象之间的交叉

因此,访问数据的一种方法是通过其索引:

ref_key = item[0]
metadata_value = item[1]
或者,要使SA为列使用特定名称,您可以使用以下方法:


为了进行调试,您可以使用一种方法,该方法将告诉您查询返回的列的名称。

哦,我没有意识到它必须通过数字索引进行访问——我不喜欢依赖列顺序,以防我想在查询中添加其他任意列,所以您的替代解决方案正是我想要的,谢谢!你不必通过数字索引键来访问它-带索引键的元组也允许通过
obj.attribute
语法进行访问-我的回答的后半部分解释了如何使它工作。
DBSession.query(MetadataRef.key, Metadata.value)
ref_key = item[0]
metadata_value = item[1]
for item in DBSession.query(MetadataRef.key.label('ref_key'), Metadata.value.label('meta_value'))...
    self._meta[item.key] = item.meta_value