flask-sqlalchemy 附加到 pickletype 不会更新

Joh*_*etz 5 python sqlalchemy flask flask-sqlalchemy

我有以下 Flask-sqlalchemy 表:

class Repo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    followers = db.Column(db.PickleType, nullable=False)
    created_on = db.Column(db.DateTime, default=datetime.utcnow)
    last_modified = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
Run Code Online (Sandbox Code Playgroud)

假设我创建了以下行并将其推送到数据库:

repo = Repo(
    name='My Repo',
    followers=[
        {'name': 'Johnny', 'id': 34752, 'views': 6},
        {'name': 'Mike', 'id': 69241, 'views': 3}
    ]
)
db.session.add(repo)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

如果我想更改该行,我应该能够执行以下操作;但是,数据库并未反映更改。

repo.data.append({'name': 'Jessica', 'id': 12941, 'views': 12})
print(len(repo.data))
# 3
db.session.commit()
print(len(repo.data))
# 2
Run Code Online (Sandbox Code Playgroud)

我想出了以下解决方法,但我想知道为什么原始方法不能按预期工作。

data = list(repo.data)
data.append({'name': 'Jessica', 'id': 12941, 'views': 12})
repo.data = data
db.session.commit()
print(len(repo.data))
# 3
Run Code Online (Sandbox Code Playgroud)

小智 0

为了使 sqlalchemy 跟踪 PickleType 列的更改,您需要将其设置为mutable=true。在你的例子中:

followers = db.Column(db.PickleType(mutable=True), nullable=False)
Run Code Online (Sandbox Code Playgroud)