![](/img/trans.png)
[英]sqlalchemy returning result as Query object instead of MyModel type
[英]SQLAlchemy with Postgres: Property returning JSONElement instead of result
目標:對象具有兩個屬性:第一個屬性指向由JSON數組支持的Python列表。 第二個屬性指向該第一個屬性列表中的特定索引。
問題:上面列出的第二個屬性當前不起作用。
背景:具有從TypeDecorator
派生的JSONB
SQLAlchemy屬性可以JSONB
工作。 當嘗試索引屬性時(例如,提取數組中的第二個值),我得到了JSONElement
(從BinaryExpression
派生)而不是實際結果。
我的課程中的屬性定義如下:
class MyClass...
values_to_hold = Column(MyArr)
MyClass.second_val_in_arr = MyClass.values_to_hold[1]
second_val_in_arr
返回JSONElement
而不是預期的結果。 顯式添加astext
( MyClass.values_to_hold[1].astext
)也無濟於事。
如果我設置:
MyClass.second_val_in_arr = MyClass.values_to_hold
然后second_val_in_arr
將按預期返回實際數組。 但是,如果我嘗試對數組執行索引操作(如上所述),則它突然返回JSONElement
。
附加信息:
MyArr
是一個TypeDecorator
,如下所示:
class MyArr(TypeDecorator):
impl = JSONB
def coerce_compared_value(self, op, value):
return self.impl.coerce_compared_value(op, value)
def process_result_value(self, value, dialect):
if value:
return list(value)
else:
return list()
(請注意,由於docs要求JSON需要特殊邏輯,因此coerce_compared_value
被顯式覆蓋)。
分配
MyClass.second_val_in_arr = MyClass.values_to_hold[1]
只會將JSONElement
作為常規屬性添加到該類。 SQLAlchemy不會以任何特殊方式對其進行處理,因此該類的實例將從該類中查找該屬性,從而產生原始JSONElement
。 而是定義一個hybrid屬性 :
from sqlalchemy.ext.hybrid import hybrid_property
class MyClass(...):
values_to_hold = Column(MyArr)
@hybrid_property
def second_val_in_arr(self):
return self.values_to_hold[1]
通過類進行訪問時,雜化將在查詢上下文中充當JSONElement
/ BinaryExpression
。 在類的實例上訪問時,它將在values_to_hold
返回第二項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.