Attributo auto-incrementante con logica personalizzata in SQLAlchemy
-
10-07-2019 - |
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.
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)
...