1

我有一个简单的“发票”类,其中有一个“数字”属性,当用户保存发票时,该属性必须由应用程序分配。有一些限制:

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 不处理默认值。

4

1 回答 1

6

您是否有任何特殊原因不只是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)
    ...
于 2009-06-24T12:47:25.807 回答