2016-07-11 15 views
-1

Mein Test Tisch hat eine JSONB Spalte data:SQLAlchemy: column_property jsonb Betrieb

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

Ein typisches Dokument enthält zwei Listen:

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

Mit einem column_property würde ich diese zwei Listen anpassen möchten so Es ist als Wörterbuch verfügbar. In "offenen Bereich" Python ist dies einfach:

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

Aber mit einem column_property:

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

ergibt dies:

AttributeError: 'dict' object has no attribute 'label'

Ist dies tatsächlich möglich ist und wie soll dies geschehen?

Antwort

0

Löst es Ihr Problem?

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

'NotImplementedError: Operator 'getitem' ist nicht in diesem expression' unterstützt – API

+1

Entschuldigen Sie, ersetzen Sie "Test.data" durch "self.data" –

+0

Danke, das funktioniert; aber es ist eine temporäre Lösung für mich, da ich die 'column_property'-Optionen wie' deferred' und 'info' – API

0

In PostgreSQL würde es so etwas (für 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; 

In 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'))) 
     ) 
    )