アップデート:
この問題を抱えている人にとっては、最新の SQLAlchemyでこの動作が修正されています。
元の問題:
アソシエーション プロキシを正しく更新するのに問題があります。
ここでモデル例を使用: http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/associationproxy.html#simplifying-association-objects
ただし、次の行で UserKeyword を変更します。
keyword = relationship("Keyword", backref=backref("user_keywords", cascade="all, delete-orphan"))
これをキーワードに追加します:
users = association_proxy('user_keywords', 'user')
したがって、キーワード インスタンスにはユーザーのリストがあります。
以下は期待どおりに機能します。
>>> rory = User("rory")
>>> session.add(rory)
>>> chicken = Keyword('chicken')
>>> session.add(chicken)
>>> rory.keywords.append(chicken)
>>> chicken.users
[<__main__.User object at 0x1f1c0d0>]
>>> chicken.user_keywords
[<__main__.UserKeyword object at 0x1f1c450>]
しかし、除去は奇妙なことをします。アソシエーション プロキシ リストから削除するには、次のようにします。
>>> rory.keywords.remove(chicken)
SA が外部キー列の 1 つを NULL に設定しようとすると、整合性エラーが発生します。
これを行う:
>>> rory.user_keywords.remove(rory.user_keywords[0])
結果は次のようになります。
>>> chicken.users
[None]
明らかな何かを見逃しましたね。