我有一个简单的“发票”类,其中包含“Number”属性 当用户保存发票时由应用程序分配。那里 是一些限制因素:
1)应用程序是一个(瘦)客户端 - 服务器,所以无论如何
分配号码必须注意碰撞
2)发票也有“版本”属性,所以我不能使用简单的
DBMS级自动增量字段
我正在尝试使用自定义类型构建它,每个类型都会启动 发票保存的时间。每当调用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
我现在的问题是当我保存发票和自动增量时 将“1”设置为其编号的值,Invoice实例不获取 用新号码更新..这是预期的吗?我错过了吗 什么? 非常感谢你的时间!
(Python 2.6上的SQLA 0.5.3,使用postgreSQL 8.3)
编辑:Michael Bayer告诉我这种行为是预期的,因为TypeDecorators不会处理默认值。
答案 0 :(得分:3)
您是否有任何特殊原因不在列定义中使用default=
参数? (这可以是任意Python可调用的。)
def generate_invoice_number():
# special logic to generate a unique invoice number
class Invoice(DeclarativeBase):
__tablename__ = 'invoice'
number = Column(Integer, unique=True, default=generate_invoice_number)
...