Вы можете создать собственный тип, подклассов sqlalchemy.types.TypeDecorator
для обработки сериализации и десериализации в текст.
Реализация может выглядеть
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
Пример использования:
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()
Это описано в an example in the SQLAlchemy docs, который также показывает, как отслеживать мутации этого словаря.
Этот подход должен работать для всех версий Python, а просто передавая json
в качестве значения к pickler
аргумента PickleType
не будет работать правильно, так как AlexGrönholm points out в своем комментарии на другой ответ.
Ваш ответ не является полным, поэтому его нельзя принять. В нем также есть ссылки на «принятый ответ», который отклоняет любую попытку и меняет это конкретное состояние на любой ответ. Пожалуйста, начните с правильного ответа, и (если вы должны) включить то, что другие сделали неправильно в конце. –
@ JonasByström справедливо, я удалил ссылку на принятый в настоящее время ответ и немного расширил пример – karlson
Это сработало, когда я его впервые установил. Однако после добавления нового поля в мою модель ('product_count = db.Column (db.Integer)') он дает мне следующую ошибку при переносе изменений в mysql: 'NameError: name 'TextPickleType' не определен' – iamlolz