sqlalchemy id равенство против ссылочного равенства - PullRequest
8 голосов
/ 18 ноября 2011

Я работаю с SQLAlchemy впервые и мне было интересно ... Вообще говоря, достаточно ли полагаться на семантику равенства Python по умолчанию при работе с равенством SQLAlchemy против идентификатора (первичного ключа)?

ВВ других проектах, над которыми я работал в прошлом с использованием технологий ORM, таких как Java Hibernate, мы всегда переопределяли .equals () для проверки на равенство первичного ключа / идентификатора объекта, но когда я оглядываюсь назад, я не уверен, что это быловсегда необходимо.

В большинстве, если не во всех случаях, о которых я могу думать, у вас когда-либо была только одна ссылка на данный объект с заданным идентификатором.И этот объект всегда был присоединенным объектом, так что технически вы могли бы избежать неприятностей с равенством ссылок.

Короткий вопрос: должен ли я переопределять eq () и hash () для моих бизнес-сущностей при использовании SQLAlchemy?

Ответы [ 2 ]

8 голосов
/ 18 ноября 2011

Краткий ответ: Нет, если вы не работаете с несколькими объектами Session.

Более длинный ответ, цитируя потрясающую документацию :

Концепция ORM, работающая здесь, известна как карта идентификации и гарантирует, что все операции над определенной строкой в ​​сеансе работают с одним и тем же набором данных. Как только объект с определенным первичным ключом присутствует в сеансе, все SQL-запросы в этом сеансе всегда возвращают один и тот же объект Python для этого конкретного первичного ключа; он также выдаст ошибку, если будет предпринята попытка поместить в сеанс второй уже сохраненный объект с тем же первичным ключом.

1 голос
/ 18 ноября 2011

У меня было несколько ситуаций, когда мое приложение sqlalchemy загружало несколько экземпляров одного и того же объекта (многопоточность / разные сеансы sqlalchemy ...). Для этих объектов было абсолютно необходимо переопределить eq (), иначе у меня возникли различные проблемы. Это может быть проблемой в моем дизайне приложения, но, вероятно, не повредит переопределить eq () просто для уверенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...