È possibile creare un tipo personalizzato da sottoclasse sqlalchemy.types.TypeDecorator
per gestire la serializzazione e deserializzazione in testo.
Un'implementazione potrebbe essere simile
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
Esempio di utilizzo:
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()
Questo è delineato nella an example in the SQLAlchemy docs, che mostra anche come monitorare le mutazioni di quel dizionario.
Questo approccio dovrebbe funzionare per tutte le versioni di Python, mentre semplicemente passando json
come valore al pickler
argomento PickleType
non funziona correttamente, come AlexGrönholm points out nel suo commento su un'altra risposta.
La tua risposta non è completa, quindi non posso accettare. Ha anche riferimenti a "la risposta accettata" che devia qualsiasi tentativo e modifica quello stato particolare in ogni risposta. Per favore, inizia con una risposta corretta e (se devi) includi ciò che altri hanno sbagliato alla fine. –
@ JonasByström abbastanza corretto, ho rimosso il riferimento alla risposta attualmente accettata e esteso l'esempio un po ' – karlson
Questo ha funzionato quando l'ho installato. Comunque dopo aver aggiunto un nuovo campo al mio modello ('product_count = db.Column (db.Integer)') mi dà il seguente errore durante la migrazione delle modifiche a mysql: 'NameError: name 'TextPickleType' non è definito' – iamlolz