有没有办法强制sqlalchemy映射的对象被考虑dirty?例如,给出sqlalchemy的对象关系教程 的上下文,证明了问题,
a=session.query(User).first()
a.__dict__['name']='eh'
session.dirty
Run Code Online (Sandbox Code Playgroud)
高产,
IdentitySet([])
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来强迫用户a进入脏状态.
出现此问题是因为使用sqlalchemy映射的类控制了属性getter/setter方法,这会阻止sqlalchemy注册更改.
我的提交不会保存对数据库的任何更改:
# project/models.py
from project import db
from sqlalchemy.dialects.postgresql import JSON
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
clientid = db.Column(db.String(64))
...
contextjason = db.Column(JSON)
Run Code Online (Sandbox Code Playgroud)
# project/__init__.py
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
from project.models import Customer
custObj = Customer.query.filter(Customer.custid == custid).first()
print(custObj.contextjason) # works fine
custObj.contextjason = { 'foo':'bar', 'so':'be it'}
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
提交不会向数据库提交任何更改。实际上,我不知道它在后台做什么。
谁能告诉我为什么我没有数据库更新?
我可以告诉提交以某种方式记录它在做什么(也许是 SQL 明智的)?
编辑:
使用 SQLALCHEMY_ECHO=True
我得到这个提交:
2018-05-23 16:42:17,102 信息 sqlalchemy.engine.base.Engine COMMIT