Pyramid/SQLAlchemy连接模型的问题

2024-10-01 11:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python非常陌生,对Pyramid也很陌生(这是我用Python写的第一篇文章),而且在数据库查询方面遇到了问题。。。你知道吗

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

  • MetadataRef(包含有关给定元数据类型的信息)
  • 元数据(包含实际元数据)--这是MetadataRef的子级
  • 用户(包含用户)--此链接到元数据。元数据参考模型='用户'和metadata.model\标识= 用户id你知道吗

我需要访问MetadataRef中的name和Metadata中的value。你知道吗

这是我的密码:

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\u id,但这是次要的,我很确定我自己可以解决这个问题):

SELECT metadata_refs.`key` AS metadata_refs_key, metadata.value AS metadata_value 
FROM metadata_refs LEFT OUTER JOIN metadata ON metadata_refs.id = metadata.metadata_ref_id 
WHERE metadata.model_id = %s AND metadata_refs.model = %s

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

AttributeError: 'KeyedTuple' object has no attribute 'metadata_value'

这让我觉得有其他方法可以访问它,但我不知道如何访问。我试过.value.metadata_value.key按预期工作。你知道吗

有什么想法吗?你知道吗


Tags: 数据key用户selfidmodelvalueitem
1条回答
网友
1楼 · 发布于 2024-10-01 11:24:49

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

DBSession.query(MetadataRef.key, Metadata.value)

在本例中,查询返回的不是完整的ORM映射对象,而是KeyedTuple,它是元组和具有与字段的“标签”对应的属性的对象之间的交叉。你知道吗

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

ref_key = item[0]
metadata_value = item[1]

或者,要使SA使用列的特定名称,可以使用Column.label()方法:

for item in DBSession.query(MetadataRef.key.label('ref_key'), Metadata.value.label('meta_value'))...
    self._meta[item.key] = item.meta_value

对于调试,可以使用Query.column_descriptions()方法,该方法将告诉您查询返回的列的名称。你知道吗

相关问题 更多 >