Frage

Ich habe eine einfache „Rechnungen“ Klasse mit einem „Nummer“ Attribute, das muss von der Anwendung zugeordnet werden, wenn der Benutzer eine Rechnung spart. Dort einige Einschränkungen sind:

1) die Anwendung einen (dünner) Client-Server ein, so was auch immer ordnet die Nummer muss für Kollisionen achten
2) Rechnungen hat eine „Version“ Attribut zu, so kann ich nicht einfach verwenden DBMS-Ebene selbstinkrementierende Feld

Ich versuche, dies mit einem benutzerdefinierten Typ zu bauen, die in jedem Kick würden Zeit wird eine Rechnung gespeichert. Jedes Mal, wenn process_bind_param heißt mit ein Wert None, wird es einen Singleton irgendeiner Art nennen, um zu bestimmen Kollisionen Anzahl und vermeiden. Ist dies eine anständige Lösung? Wie auch immer, ich ein Problem habe .. Hier ist meine Wünsch Art:

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

Mein Problem ist im Moment, dass, wenn ich eine Rechnung und AutoIncrement sparen Sets "1" als Wert für die Nummer, die Rechnungs Instanz nicht get mit der neuen Nummer aktualisiert .. Ist das erwartet? Bin ich fehlt etwas? Vielen Dank für Ihre Zeit!

(SQLA 0.5.3 auf Python 2.6, mit postgreSQL 8.3)

Edit:. Michael Bayer hat mir gesagt, dass dieses Verhalten zu erwarten ist, da TypeDecorators nicht mit Standardwerten beschäftigen

War es hilfreich?

Lösung

Gibt es einen besonderen Grund, warum Sie nicht einfach einen default= Parameter in der Spaltendefinition verwenden? (Dies kann eine beliebige Python aufrufbar sein).

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)
    ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top