Просто присвоение значения и его фиксация будет работать для всех типов данных, кроме атрибутов JSON и Pickled.Поскольку рассортированный тип описан выше, я запишу немного другой, но простой способ обновления JSON.
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
data = db.Column(db.JSON)
def __init__(self, name, data):
self.name = name
self.data = data
Допустим, модель похожа на приведенную выше.
user = User("Jon Dove", {"country":"Sri Lanka"})
db.session.add(user)
db.session.flush()
db.session.commit()
Это добавит пользователя в базу данных MySQL с данными {"страна": "Шри-Ланка"}
Изменение данных будет игнорироваться.Мой код, который не работал, выглядит следующим образом.
user = User.query().filter(User.name=='Jon Dove')
data = user.data
data["province"] = "south"
user.data = data
db.session.merge(user)
db.session.flush()
db.session.commit()
Вместо того, чтобы выполнять мучительную работу по копированию JSON в новый dict (не назначая его новой переменной, как указано выше), который должен иметьЯ нашел простой способ сделать это.Есть способ пометить систему, что JSON были изменены.
Ниже приведен рабочий код.
from sqlalchemy.orm.attributes import flag_modified
user = User.query().filter(User.name=='Jon Dove')
data = user.data
data["province"] = "south"
user.data = data
flag_modified(user, "data")
db.session.merge(user)
db.session.flush()
db.session.commit()
Это сработало как шарм.Есть другой метод, предложенный вместе с этим методом здесь Надеюсь, я помог кому-то.