Vorrei rivedere alcuni dei miei modelli SQLAlchemy esistenti in un datastore di sola aggiunta; append-only significa che l'oggetto viene aggiornato solo con le istruzioni INSERT, non utilizzando le istruzioni UPDATE o DELETE.Come implementare un modello con versione solo append in SQLAlchemy
Le istruzioni UPDATE e DELETE verranno sostituite con un altro INSERT che incrementa la versione. Ci sarebbe una bandiera is_deleted
invece di DELETE, verrebbe creata una nuova versione con is_deleted=True
:
id | version | is_deleted | name | description ...
---- --------- ------------ ----------- ---------------
1 | 1 | F | Fo | Text text text.
1 | 2 | F | Foo | Text text text.
2 | 1 | F | Bar | null
1 | 3 | T | Foo | Text text text.
Inoltre,
- dovranno essere riscritto per solo il massimo numero di versione per tutte le istruzioni SELECT ogni id, come descritto in questa domanda: PostgreSQL - fetch the row which has the Max value for a column
- Tutti gli indici (univoci) devono essere riscritti per essere univoci dalla chiave primaria "id", poiché ciascun ID può essere presente più di una volta.
so come risolvere la maggior parte di questi problemi, ma sto lottando con i ganci di eventi in SQLAlchemy che avrebbe gestire certe cose che devono essere fatto su aggiornamento & eliminare.
La documentazione di SQLAlchemy contiene già alcuni esempi di base per il controllo delle versioni. L'esempio versioned rows si avvicina a ciò che desidero, ma non gestisce (1) l'eliminazione e (2) le relazioni con le chiavi esterne.
(1) Cancellazione. So che c'è un campo session.deleted
, e vorrei scorrere su di esso in un modo simile a come session.dirty
viene ripetuto nell'esempio versioned_rows.py, ma come faccio a rimuovere l'elemento dall'elenco da eliminare & creare un nuovo elemento?
(2) L'esempio sopra menzionato riguarda solo una relazione genitore-figlio e il modo in cui funziona (scadendo la relazione) sembra richiedere un codice personalizzato per ciascun modello. (2.1) C'è un modo per renderlo più flessibile? (2.2) è possibile configurare SQLAlchemy's relationship()
per restituire l'oggetto con max (versione) per una data chiave esterna?
Il termine che stai cercando è "soft-delete". Non so davvero SQLAlchemy, ma forse questo ti aiuterà. Personalmente probabilmente lo farei con i trigger sul lato del database. –
Grazie - Ho trovato questo su soft delete, che aiuta con la prima parte della mia domanda http://stackoverflow.com/questions/23198801/sqlalchemy-using-aliased-in-query-with-custom-primaryjoin-relationship Utilizzo del database i trigger non sono un'opzione per me perché il mio modello cambia frequentemente e i trigger non sono gestiti bene dagli strumenti di migrazione come alambicco. – lyschoening
Domanda curiosa, mi piacerebbe anche vedere alcuni esempi di come gestirlo. Per quanto riguarda il collegamento al massimo (versione), il modo migliore è probabilmente di non avere un numero di versione rispetto alla versione Head in modo da poter partecipare direttamente all'ultimo record (versione == Nessuno). I dati devono essere nella stessa tabella? Mi chiedo solo se il sistema di oggetti versioning (che crea una seconda tabella, blah_history) potrebbe semplificare le cose http://docs.sqlalchemy.org/en/latest/orm/examples.html#versioning-objects. Gestisce anche le eliminazioni in quanto l'intera cronologia delle versioni è disponibile nella tabella secondaria. –