在SQLAlchemy中使用自定义逻辑自动递增属性

时间:2009-06-24 12:42:21

标签: python sqlalchemy auto-increment

我有一个简单的“发票”类,其中包含“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不会处理默认值。

1 个答案:

答案 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)
    ...