SQLAlchemy:column_property jsonb操作

时间:2016-07-11 15:05:54

标签: python-3.x sqlalchemy jsonb

我的Test表有一个JSONB列data

class Test(Base):
    __tablename__ = 'test'
    data = Column(JSONB)

典型文档有两个列表:

{'percentage': [10, 20, 50, 80, 90],
'age': [1.21, 2.65, 5.23, 8.65, 11.78]
}

使用column_property我想要定制这两个列表,以便它可以作为字典使用。在“开放领域”Python中,这很简单:

dict(zip(Test.data['percentage'], Test.data['age']))

但是有一个column_property:

Test.data_dict = column_property(
    dict(zip(Test.data['percentage'], Test.data['age']))
)

这给出了:

  

AttributeError:'dict'对象没有属性'label'

这实际上是否可行,应如何做?

2 个答案:

答案 0 :(得分:0)

Does it solves your problem?

@property
def data_dict(self):
    return dict(zip(Test.data['percentage'], Test.data['age'])) 

答案 1 :(得分:0)

在PostgreSQL中它会像这样(对于PostgreSQL> = 9.4)

SELECT json_object(array_agg(ARRAY[p,a]))
FROM (
    SELECT unnest(ARRAY(select jsonb_array_elements_text(data->'percentage'))) p,
           unnest(ARRAY(select jsonb_array_elements_text(data->'age'))) a
    FROM test
) x;

在SQLAlchemy中

from sqlalchemy.orm import column_property
from sqlalchemy import select, alias, text
class Test(Base):
    __tablename__ = 'test'
    data = db.Column(JSONB)
    data_dict = column_property(
        select([text('json_object(array_agg(ARRAY[p,a]))')]).select_from(
            alias(select([
                text("unnest(ARRAY(select jsonb_array_elements_text(data->'percentage'))) p, \
                      unnest(ARRAY(select jsonb_array_elements_text(data->'age'))) a")
            ]).select_from(text('test')))
        )
    )