问题不在于SQLAlchemy,而是由于Python的描述符机制。每个
Column属性都是一个描述符:这就是SQLAlchemy如何“挂钩”属性检索和修改以产生数据库请求。
让我们尝试一个简单的例子:
class Desc(object): def __get__(self, obj, type=None): print '__get__' def __set__(self, obj, value): print '__set__'class A(object): desc = Desc()a = A()a.desc # prints '__get__'a.desc = 2 # prints '__set__'
但是,如果浏览
a实例
字典并为设置另一个值
'desc',则会绕过描述符协议(请参阅调用描述符):
a.__dict__['desc'] = 0 # Does not print anything !
在这里,我们只是创建了一个名为0的新 实例
属性
'desc'。该
Desc.__set__方法从未被调用过,在您的情况下,SQLAlchemy不会获得“捕获”分配的机会。
解决的办法是使用
setattr,这完全等同于编写
a.desc:
setattr(a, 'desc', 1) # Prints '__set__'



