2011-11-18 15 views
6

Estoy trabajando con SQLAlchemy por primera vez y me preguntaba ... en términos generales ¿es suficiente confiar en la semántica de igualdad predeterminada de python cuando se trabaja con SQLAlchemy vs id (clave principal) igualdad?sqlalchemy id igualdad vs igualdad de referencia

En otros proyectos en los que he trabajado anteriormente utilizando tecnologías ORM como Hibernate de Java, siempre anulabamos .equals() para verificar la igualdad de la clave/id principal de un objeto, pero cuando miro hacia atrás ' No estoy seguro de que esto sea siempre necesario.

En la mayoría de los casos, si no todos, en los que puedo pensar, solo has tenido una referencia a un objeto dado con una identificación dada. Y ese objeto siempre fue el objeto adjunto, por lo que técnicamente sería capaz de salirse con la igualdad de referencia.

pregunta corta: ¿Debería ser de primer orden eq() y de hash() para mis entidades de negocios cuando se utiliza SQLAlchemy?

Respuesta

6

Respuesta corta: No, a menos que trabaje con varios objetos de sesión.

Respuesta larga, citando el impresionante documentation:

El concepto ORM en el trabajo se conoce aquí como un mapa de la identidad y asegura que todas las operaciones sobre una fila en particular dentro de una sesión operan sobre el mismo conjunto de datos. Una vez que un objeto con una clave primaria particular está presente en la sesión, todas las consultas SQL en esa sesión siempre devolverán el mismo objeto de Python para esa clave primaria en particular; también generará un error si se intenta colocar un segundo objeto ya existente con la misma clave principal dentro de la sesión.

+0

No entendí la parte 'objeto ya persistente'; ¿No debería plantear el error si el segundo objeto ya está persistido o no? – max

1

Tuve algunas situaciones en las que mi aplicación sqlalchemy cargaba varias instancias del mismo objeto (sesiones multihilo/diferentes sqlalchemy ...). Era absolutamente necesario anular eq() para esos objetos o tendría varios problemas. Esto podría ser un problema en el diseño de mi aplicación, pero probablemente no perjudique anular eq() solo para estar seguro.