Usted puede crear un tipo personalizado subclasificando sqlalchemy.types.TypeDecorator
para manejar la serialización y deserialización a texto.
Una implementación podría ser similar
import json
import sqlalchemy
from sqlalchemy.types import TypeDecorator
SIZE = 256
class TextPickleType(TypeDecorator):
impl = sqlalchemy.Text(SIZE)
def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value
Ejemplo de uso:
class SomeModel(Base):
__tablename__ = 'the_table'
id = Column(Integer, primary_key=True)
json_field = Column(TextPickleType())
s = SomeEntity(json_field={'baked': 'beans', 'spam': 'ham'})
session.add(s)
session.commit()
Esto se describe en an example in the SQLAlchemy docs, que también muestra cómo realizar un seguimiento mutaciones de ese diccionario.
Este enfoque debería funcionar para todas las versiones de Python, mientras que simplemente pasando json
como el valor para el argumento de pickler
PickleType
no funcionará correctamente, como AlexGrönholm points out en su comentario sobre otra respuesta.
Su respuesta no está completa, por lo tanto, no puedo aceptarla. También tiene referencias a "la respuesta aceptada" que desvía cualquier intento y cambia ese estado particular en cualquier respuesta. Por favor, comience con una respuesta correcta y (si debe) incluya lo que otros han hecho mal al final. –
@ JonasByström, eliminé la referencia a la respuesta actualmente aceptada y extendí el ejemplo un poco – karlson
Esto funcionó cuando lo configuré por primera vez. Sin embargo, después de agregar un nuevo campo a mi modelo ('product_count = db.Column (db.Integer)') me da el siguiente error al migrar los cambios a mysql: 'NameError: name 'TextPickleType' no está definido' – iamlolz