Pergunta

Eu tenho um "Faturas" classe simples com um atributo "número" que tem de ser atribuído pelo aplicativo quando o usuário salva uma fatura. Lá algumas restrições:

1) a aplicação é um (fina) de um cliente-servidor, então o que atribui o número deve olhar para colisões
2) As facturas tem um atributo "versão" também, então eu não pode usar uma simples campo de nível de DBMS autoincrementável

Eu estou tentando construir esta usando um tipo personalizado que iria chutar em cada tempo de uma factura fica guardado. Sempre que process_bind_param é chamado com um valor Nenhum, ele irá chamar a exclusivo de algum tipo para determinar o Número e evitar colisões. Será esta uma solução decente? Enfim, eu estou tendo um problema .. Aqui é o meu 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

O meu problema agora é que quando eu salvar uma factura e AutoIncrement conjuntos "1" como valor para o seu número, a instância Fatura não get atualizado com o novo número .. É este o esperado? Am I missing alguma coisa? Muito obrigado pelo seu tempo!

(0.5.3 SQLA em Python 2.6, utilizando postgreSQL 8.3)

Editar:. Michael Bayer me disse que esse comportamento é esperado, já que TypeDecorators não lidam com valores padrão

Foi útil?

Solução

Há alguma razão especial que você não basta usar um parâmetro default= em sua definição de coluna? (Isso pode ser um exigível arbitrária 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)
    ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top