2011-11-18 5 views
6

Sto lavorando con SQLAlchemy per la prima volta e mi chiedevo ... in generale è sufficiente affidarsi alla semantica di uguaglianza predefinita di python quando si lavora con l'uguaglianza SQLAlchemy vs id (chiave primaria)?sqlalchemy id equality vs reference ugality

In altri progetti in cui ho lavorato in passato utilizzando tecnologie ORM come Hibernate di Java, dovremmo sempre eseguire l'override di .equals() per verificare l'uguaglianza della chiave primaria/id di un oggetto, ma quando guardo indietro I ' Non sono sicuro che fosse sempre necessario.

Nella maggior parte se non in tutti i casi a cui riesco a pensare, hai sempre avuto un riferimento a un dato oggetto con un determinato ID. E quell'oggetto era sempre l'oggetto attaccato, quindi tecnicamente saresti in grado di cavartela con l'uguaglianza di riferimento.

domanda breve: Dovrei imperativi eq() e hash() per i miei entità di business quando si utilizza SQLAlchemy?

risposta

6

Risposta breve: No, a meno che non si lavori con più oggetti Session.

Più rispondere, citando l'eccezionale documentation:

Il concetto ORM al lavoro qui è noto come una mappa identità e garantisce che tutte le operazioni su una riga particolare all'interno di una sessione operano sullo stesso insieme di dati. Una volta che un oggetto con una particolare chiave primaria è presente nella Session, tutte le query SQL su quella Session restituiranno sempre lo stesso oggetto Python per quella particolare chiave primaria; inoltre genera un errore se si tenta di posizionare un secondo oggetto già persistente con la stessa chiave primaria all'interno della sessione.

+0

Non ho capito la parte 'dell'oggetto già persistuto'; non dovrebbe sollevare l'errore se il secondo oggetto è già persistente o no? – max

1

Ho avuto alcune situazioni in cui la mia applicazione sqlalchemy avrebbe caricato più istanze dello stesso oggetto (multithreading/diverse sessioni di sqlalchemy ...). Era assolutamente necessario sovrascrivere eq() per quegli oggetti o avrei avuto vari problemi. Questo potrebbe essere un problema nella progettazione della mia applicazione, ma probabilmente non fa male sovrascrivere eq() solo per essere sicuro.