我有一个简单的<!>“发票<!>”;带有<!> quot; 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

我现在的问题是当我保存发票和自动增量时 sets <!> quot; 1 <!> quot;作为其编号的值,Invoice实例不会获取 用新号码更新..这是预期的吗?我错过了吗 什么? 非常感谢你的时间!

(Python 2.6上的SQLA 0.5.3,使用postgreSQL 8.3)

编辑:Michael Bayer告诉我这种行为是预期的,因为TypeDecorators不会处理默认值。

有帮助吗?

解决方案

您是否有任何特殊原因不在列定义中使用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)
    ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top