Domanda

Ho una semplice "Fatture" classe con un "Numero" attributo che deve essere assegnato dall'applicazione quando l'utente salva una fattura. Là ci sono alcuni vincoli:

1) l'applicazione è (thin) client-server, quindi qualunque cosa assegna il numero deve cercare le collisioni
2) Le fatture hanno una versione "quotata" anche l'attributo, quindi non posso usare un semplice Campo di incremento automatico a livello di DBMS

Sto provando a crearlo usando un Tipo personalizzato che darebbe il via a tutti volta in cui viene salvata una fattura. Ogni volta che viene chiamato process_bind_param un valore Nessuno, chiamerà un singleton di qualche tipo per determinare il numero ed evitare collisioni. È una soluzione decente? Ad ogni modo, sto riscontrando un problema. Ecco il mio tipo personalizzato:

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

Il mio problema in questo momento è che quando salvo una fattura e un incremento automatico imposta " 1 " come valore per il suo numero, l'istanza della fattura non viene visualizzata aggiornato con il nuovo numero .. È previsto? Mi sto perdendo qualcosa? Mille grazie per il tuo tempo!

(SQLA 0.5.3 su Python 2.6, usando postgreSQL 8.3)

Modifica: Michael Bayer mi ha detto che questo comportamento è previsto, dal momento che TypeDecorators non si occupa dei valori predefiniti.

È stato utile?

Soluzione

C'è qualche motivo particolare per cui non si utilizza solo un parametro default = nella definizione della colonna? (Questo può essere un richiamo arbitrario di 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)
    ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top