Vous pouvez créer un type personnalisé par le sous-classement sqlalchemy.types.TypeDecorator
pour gérer sérialisation et désérialisation au texte.
Une mise en œuvre pourrait ressembler à
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
Exemple d'utilisation:
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()
Ceci est décrit dans an example in the SQLAlchemy docs, qui montre aussi comment suivre les mutations de ce dictionnaire.
Cette approche devrait fonctionner pour toutes les versions de Python, alors tout simplement en passant json
comme la valeur à l'argument pickler
de PickleType
ne fonctionnera pas correctement, comme AlexGrönholm points out dans son commentaire sur une autre réponse.
Votre réponse n'est pas complète, donc ne peut pas accepter. Il a également des références à "la réponse acceptée" qui détourne toute tentative et changer cet état particulier sur n'importe quelle réponse. Veuillez commencer par une bonne réponse, et (si vous devez) inclure ce que les autres ont mal fait à la fin. –
@ JonasByström assez juste, j'ai supprimé la référence à la réponse actuellement acceptée et étendu l'exemple un peu – karlson
Cela a fonctionné quand je l'ai mis en place. Cependant après avoir ajouté un nouveau champ à mon modèle ('product_count = db.Column (db.Integer)') il me donne l'erreur suivante lors de la migration des modifications vers mysql: 'NameError: name 'TextPickleType' n'est pas défini' – iamlolz