2012-02-03 15 views
5

estoy usando la receta SQLAlchemy here a mágicamente JSON codificar/decodificar una columna de la base de datos en mi modelo como:SQLAlchemy sinónimo columna con diferentes tipos

class Thing(Base): 
    __tablename__ = 'things' 
    id = Column(Integer(), primary_key=True) 
    data = Column(JSONEncodedDict) 

I con un obstáculo cuando quería crear una campo extra "raw_data" en mi modelo para acceder a los mismos datos JSON subyacentes, pero sin codificación/decodificación:

raw_data = Column("data", VARCHAR) 

SQLAlchemy parece confundirse con el nombre de colisión y dejar una columna asignada por la ONU. ¿Hay alguna manera de convencer a SQLAlchemy de que realmente asigne ambos atributos a la misma columna?

Respuesta

3

Definiría la columna raw_data a través de SQLAlchemy y luego usaría la propiedad/setter de Python para hacer un uso transparente de data. Es decir .:

class Thing(Base): 
    __tablename__ = 'things' 
    id = Column(Integer(), primary_key=True) 
    raw_data = Column(String()) 

    @property 
    def data(self): 
     # add some checking here too 
     return json.loads(self.raw_data) 

    @data.setter 
    def data(self, value): 
     # dito 
     self.raw_data = json.dumps(value) 
+0

Hay 2 problemas: 1) no maneja adecuadamente las mutaciones in situ, 2) JSON se analiza para cada acceso de atributo. –

+0

@Denis: el seguimiento de mutaciones in situ es casi ortogonal. He estado jugando con eso, y hay mucho más que lo que el ejemplo en los documentos implica: https://gist.github.com/1730610. –

+0

@DenisOtkidach, el segundo problema se resuelve fácilmente caché usted mismo. Es una especie de optimización prematura, así que no lo incluí de inmediato. No tengo mucha experiencia con SQLAlchemy en particular, pero por lo que veo, esta solución no es un enfoque poco común. –

Cuestiones relacionadas