我对Python非常陌生,对Pyramid也很陌生(这是我用Python写的第一篇文章),而且在数据库查询方面遇到了问题。。。你知道吗
我有以下模型(与我的问题相关):
我需要访问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
按预期工作。你知道吗
有什么想法吗?你知道吗
您正在查询单独的属性(SA文档中的“启用ORM的描述符”):
在本例中,查询返回的不是完整的ORM映射对象,而是KeyedTuple,它是元组和具有与字段的“标签”对应的属性的对象之间的交叉。你知道吗
因此,访问数据的一种方法是通过其索引:
或者,要使SA使用列的特定名称,可以使用Column.label()方法:
对于调试,可以使用Query.column_descriptions()方法,该方法将告诉您查询返回的列的名称。你知道吗
相关问题 更多 >
编程相关推荐