2009-04-11 10 views
8

Sto cercando di utilizzare SQLAlchemy per implementare un modello di gruppi di utenti di base in cui gli utenti possono avere più gruppi e gruppi possono avere più utenti.SQLAlchemy cancellazione orfani molti a molti

Quando un gruppo diventa vuoto, voglio che il gruppo sia cancellato (insieme ad altre cose associate al gruppo.) Fortunatamente, la cascata di SQLAlchemy funziona bene con queste situazioni più semplici).

Il problema è che cascade = 'all, delete-orphan' non fa esattamente quello che voglio; invece di eliminare il gruppo quando il gruppo diventa vuoto, cancella il gruppo quando qualsiasi membro lascia il gruppo.

L'aggiunta di trigger al database funziona correttamente per l'eliminazione di un gruppo quando diventa vuoto, tranne per il fatto che i trigger sembrano ignorare l'elaborazione a cascata di SQLAlchemy, quindi le cose associate al gruppo non vengono eliminate.

Qual è il modo migliore per eliminare un gruppo quando tutti i suoi membri lasciano questa eliminazione in cascata a entità correlate.

Capisco che potrei farlo manualmente trovando ogni posto nel mio codice in cui un utente può lasciare un gruppo e poi fare la stessa cosa del trigger tuttavia, temo che mi mancherebbe il codice (e io sono pigro).

+0

Penso che potrebbe essere un po 'complicato rispondere a questa domanda senza ulteriori dettagli sul tuo codice (come hai impostato la relazione molti-a-molti, dove hai inserito delete-orphan, ecc), grosso modo è lo schema, ecc. –

+0

Ho provato l'eliminazione-orfano sul backref e la relazione normale(). La relazione è fondamentalmente un mapper (Utente, utenti, proprietà = {'gruppi': relazione = relazione (Gruppo, secondario = gruppi_utente, backref = backref ('utenti'))}) –

risposta

3

Il modo in cui generalmente ho gestito questo è di avere una funzione sul proprio utente o gruppo chiamato leave_group. Quando vuoi che un utente lasci un gruppo, chiami quella funzione, e puoi aggiungere qualsiasi effetto collaterale che desideri. A lungo termine, questo rende più facile aggiungere sempre più effetti collaterali. (Ad esempio quando si desidera verificare che qualcuno sia autorizzato a lasciare un gruppo).

3

Penso che vogliate cascade='save, update, merge, expunge, refresh, delete-orphan'. Questo impedirà la "cancellazione" a cascata (che ottieni da "tutti") ma mantieni il "delete-orphan", che è quello che stai cercando, credo (cancella quando non ci sono più genitori).

+1

In SA 0.6: 'Il 'delete- l'opzione a cascata "orfana" richiede "cancella" » – ThiefMaster

0

Potresti pubblicare un esempio del tuo tavolo e del tuo mapper? Potrebbe essere più facile individuare cosa sta succedendo.

Senza vedere il codice è difficile dirlo, ma forse c'è qualcosa di sbagliato nella direzione della relazione?

2

Ho avuto lo stesso problema circa 3 mesi fa, ho una relazione Post/Tags e volevo eliminare i tag non utilizzati. Ho chiesto su irc e l'autore di SA mi ha detto che cascate su relazioni molti-a-molti non sono supportate, il che ha senso dal momento che non c'è un "genitore" in molti a molti.

Ma l'estensione di SA è semplice, è possibile utilizzare uno AttributeExtension per verificare se il gruppo è vuoto quando viene rimosso da un utente e cancellarlo da lì.

Problemi correlati