2017-08-03 56 views
0

目標:對象有兩個屬性:第一個屬性指向一個由JSON數組支持的Python列表。第二個屬性指向第一個屬性列表中的特定索引。SQLAlchemy with Postgres:屬性返回JSONElement而不是結果

問題:上面列出的第二個屬性目前不起作用。

背景:從JSONB導出的SQLAlchemy屬性TypeDecorator按預期工作。嘗試索引屬性時(例如,提取數組中的第二個值),我得到JSONElement(源自BinaryExpression)而不是實際結果。在我的課

屬性的定義如下:

​​

second_val_in_arr返回JSONElement而不是結果如預期。明確添加astextMyClass.values_to_hold[1].astext)也沒有幫助。

如果我設置:

MyClass.second_val_in_arr = MyClass.values_to_hold 

然後second_val_in_arr返回實際數組預期。但是,如果我嘗試對數組執行索引操作(如上所述),那麼它突然返回一個JSONElement

附加信息:

MyArrTypeDecorator如下:

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() 

(注意coerce_compared_value被明確覆蓋因爲JSON需要作爲每docs特殊邏輯的)。

回答

1

分配

MyClass.second_val_in_arr = MyClass.values_to_hold[1] 

將只需添加JSONElement作爲常規屬性的類。 SQLAlchemy不會以任何特殊方式對待它,因此該類的實例將從類中查找屬性,從而生成原始的JSONElement。代替限定hybrid attribute

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中的第二項。

相關問題