我有一个简单的“发票”类,其中有一个“数字”属性,当用户保存发票时,该属性必须由应用程序分配。有一些限制:
1)应用程序是一个(瘦)客户端-服务器应用程序,所以无论分配数字都必须注意冲突
2)发票也有一个“版本”属性,所以我不能使用简单的 DBMS 级自动增量字段
我正在尝试使用每次保存发票时都会启动的自定义类型来构建它。每当使用 None 值调用 process_bind_param 时,它将调用某种单例来确定数量并避免冲突。这是一个体面的解决方案吗?无论如何,我遇到了问题.. 这是我的自定义类型:
class AutoIncrement(types.TypeDecorator):
impl = types.Unicode
def copy(self):
return AutoIncrement()
def process_bind_param(self, value, dialect):
if not value:
# Must find next autoincrement value
value = "1" # Test value :)
return value
我现在的问题是,当我保存 Invoice 并且 AutoIncrement 将“1”设置为其编号的值时,Invoice 实例不会使用新编号进行更新。这是预期的吗?我错过了什么吗?非常感谢您的宝贵时间!
(Python 2.6 上的 SQLA 0.5.3,使用 postgreSQL 8.3)
编辑: Michael Bayer 告诉我这种行为是意料之中的,因为 TypeDecorators 不处理默认值。