Pregunta

Tengo una simple "Facturas" clase con un " Número " atributo que tiene que ser asignado por la aplicación cuando el usuario guarda una factura. Ahí son algunas restricciones:

1) la aplicación es una (delgada) cliente-servidor, así que lo que sea asigna el número debe buscar colisiones
2) Las facturas tienen una '' versión '' atributo también, así que no puedo usar un simple Campo de aumento automático de DBMS

Estoy tratando de construir esto usando un tipo personalizado que patearía cada hora en que se guarda una factura. Siempre que se llame a process_bind_param con un valor None, llamará a un singleton de algún tipo para determinar el número y evitar colisiones. ¿Es esta una solución decente? De todos modos, tengo un problema. Aquí está mi tipo personalizado:

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

Mi problema en este momento es que cuando guardo una factura y AutoIncrement establece " 1 " como valor para su número, la instancia de Factura no obtiene actualizado con el nuevo número .. ¿Se espera esto? Me estoy perdiendo ¿alguna cosa? ¡Muchas gracias por tu tiempo!

(SQLA 0.5.3 en Python 2.6, usando postgreSQL 8.3)

Editar: Michael Bayer me dijo que se espera este comportamiento, ya que TypeDecorators no maneja los valores predeterminados.

¿Fue útil?

Solución

¿Hay alguna razón en particular por la que no solo use un parámetro default = en la definición de su columna? (Esto puede ser un Python arbitrario invocable).

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)
    ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top