2009-06-24 68 views
1

我有一个简单的“发票”类,具有必须由应用程序在用户保存发票时分配的“数量”属性 。有 一些制约因素:在SQLAlchemy中使用自定义逻辑自动递增属性

1)应用程序是(瘦)客户端 - 服务器之一,所以无论 分配数量必须寻找出碰撞
2)发票有一个“版本”属性也一样,所以我不能使用一个简单的 DBMS级别的自动增量字段

我试图建立这个使用自定义类型,它会在发票得到保存每个 时间踢。每当process_bind_param被调用 一个None值时,它将调用某种类型的单例来确定 号码并避免冲突。这是一个体面的解决方案? 无论如何,我有一个问题..这里是我的自定义类型:

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”的价值它的编号,发票实例不会得到 用新的数字更新..这是预期的吗?我是否缺少 的东西? 非常感谢您的时间!

(SQLA 0.5.3关于Python 2.6,使用PostgreSQL 8.3)

编辑:迈克尔·拜尔告诉我,这是正常现象,因为TypeDecorators不使用默认值处理。

回答

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) 
    ... 
+0

哎哟不知道你可以在那里使用callable,谢谢!我会马上试试:) – Joril 2009-06-24 12:57:27