2011-11-18 16 views
6

私はSQLAlchemyをはじめて使用していて、不思議に思っていました...一般的に言えば、SQLAlchemyとid(主キー)の等価性を比較すると、Pythonのデフォルトの等価セマンティクスに頼るだけで十分です。sqlalchemy idの等価対参照の等価性

私はこれまで、JavaのHibernateなどのORMテクノロジを使用して作業してきましたが、オブジェクトの主キー/ IDの等価性をチェックするために.equals()をオーバーライドしますが、これがいつも必要であるかどうかわからない。ほとんどの場合ではない私は考えることができるすべての場合において

は、あなたは今まで指定されたidで指定されたオブジェクトへの一つの基準を持っていました。そのオブジェクトは常に添付オブジェクトだったので、技術的には参照の平等を取り除くことができます。

短い質問:SQLAlchemyのを使用しているとき、私は私のビジネスエンティティのためEQ()とハッシュを()をオーバーライドする必要がありますか。

答えて

6

短い答え:いいえ、あなたは複数のSessionオブジェクトで作業している場合を除きます。

素晴らしい documentationを引用

長い答え、:ここに仕事で

ORMのコンセプトは、アイデンティティ・マップとして知られており、セッション内の特定の行の際にすべての操作は、同じデータセットに対して動作ことが保証されています。特定の主キーを持つオブジェクトがセッションに存在していると、そのセッションのすべてのSQLクエリは、常にその特定の主キーに同じPythonオブジェクトを返します。試みがセッション内で同じ主キーを持つ二、すでに永続化オブジェクトを配置するために行われた場合、それはまた、エラーが発生します。

+0

私は 'すでに永続化object'部分を理解していませんでした。 2番目のオブジェクトがすでに永続化されているかどうかは、エラーを発生させるべきではありませんか? – max

1

私はSQLAlchemyのアプリケーションが同じオブジェクト(マルチスレッド/異なるSQLAlchemyのセッション...)の複数のインスタンスをロードし、いくつかの状況がありました。これらのオブジェクトのeq()をオーバーライドすることが絶対に必要でした。そうしないとさまざまな問題が発生します。これは私のアプリケーション設計の問題かもしれませんが、確かにeq()をオーバーライドすることはおそらく害ではありません。

関連する問題