簡體   English   中英

帶Postgres的SQLAlchemy:屬性返回JSONElement而不是結果

[英]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而不是預期的結果。 顯式添加astextMyClass.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM