Question

J'ai un simple "Factures". classe avec un " numéro " attribut qui doit être attribué par l'application lorsque l'utilisateur enregistre une facture. Là y a quelques contraintes:

1) L’application est une application client-serveur (légère). attribue le numéro doit rechercher les collisions
2) Les factures ont une "version". attribuer aussi, donc je ne peux pas utiliser un simple Champ auto-incrémenté de niveau SGBD

J'essaie de construire ceci en utilisant un type personnalisé qui ferait entrer tous les fois qu'une facture est sauvegardée. Chaque fois que process_bind_param est appelé avec aucune valeur, elle appellera un singleton d’une certaine sorte pour déterminer la nombre et éviter les collisions. Est-ce une solution décente? Quoi qu'il en soit, j'ai un problème .. Voici mon type personnalisé:

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

Mon problème actuel est que, lorsque je sauvegarde une facture et une incrémentation automatique ensembles " 1 " comme valeur pour son numéro, l'instance de facture n'est pas mis à jour avec le nouveau numéro .. Est-ce prévu? Est-ce que je manque quelque chose? Merci beaucoup pour votre temps!

(SQLA 0.5.3 sur Python 2.6, utilisant postgreSQL 8.3)

Modifier: Michael Bayer m'a dit que ce problème était attendu, car TypeDecorators ne traite pas les valeurs par défaut.

Était-ce utile?

La solution

Y a-t-il une raison particulière pour laquelle vous n'utilisez pas simplement un paramètre default = dans votre définition de colonne? (Cela peut être un appelable Python arbitraire).

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)
    ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top