1

A(id、...他の列)とB(id、...他の列)の2つのテーブルがある場合。コメント (別のテーブル: ID、テキスト、作成者) を A オブジェクトと B オブジェクトに関連付ける必要があります。

その目的のために 4 番目のテーブルを作成するようなことはできますか: comment_id、table_id (A または B またはその他)、item_id? 私はいくつかのsqlalchemyの方法を意味しますか?

http://bpaste.net/show/27149/ - A と B ごとに、コメント付きの個別の表があります。 ある著者によるすべてのコメントを見たい場合、これらのテーブルは同一である (はずである) ため、それは良い考えではないと思います - いつか C テーブルが存在する場合、他の方法よりも難しいでしょう - 私はコメント用のテーブルを作成する必要があります...

別の解決策 - http://bpaste.net/show/27148/。より良いと思いますが、アイテムにコメントする必要があるすべてのテーブルに対して関連付けテーブルを作成する必要があります。

何か案は?前もって感謝します。

4

2 に答える 2

2

あなたは試すことができます:

class Comment(Base):
    __tablename__ = 'comments'

    id = Column(Integer, primary_key=True)
    a_id = Column(Integer, ForeignKey('a.id'), nullable=True)
    b_id = Column(Integer, ForeignKey('b.id'), nullable=True)
    text = Column(UnicodeText, nullable=False)

    def __init__(self, text):
        self.text = text

それはまだ比較的ハッキーな方法ですが、外部キーを使用することで参照整合性を維持します。

テーブル名を格納するソリューションを利用したい場合は、次のような方法を試すことができます。

class A(Base):
    __tablename__ = 'as'

    id = Column(Integer, primary_key=True)
    name = Column(Unicode, nullable=False, unique=True)
    comments = relationship("Comment",
                    primaryjoin="and_(A.id==Comment.id, "
                        "Comment.model=='A')")

    def __init__(self, name):
        self.name = name

class Comment(Base):
    __tablename__ = 'comments'

    id = Column(Integer, primary_key=True)
    text = Column(UnicodeText, nullable=False)
    model = Column(String(50), nullable=False)

    def __init__(self, text):
        self.text = text

私はこれを自分でテストしていません。問題が発生した場合は、代替結合条件の指定またはコメントを参照してください。さらに調査を行います。

この主題の詳細な説明については、ポリモーフィックアソシエーションに関するMikeBayerのブログエントリを参照してください。

于 2012-04-16T15:06:45.937 に答える
0

私も2番目の解決策に行きます。しかし、あなたが言うように、第 3 のテーブルが存在する可能性があるため、次のように、フィールドを 1 つの関連付けテーブルにC入れることができます。B_CommentA_Comment

class Comment(Base):
    id = Column(Integer, primary_key=True)
    a_id = Column(Integer, ForeignKey('as.id'), primary_key=True, nullable=True)
    b_id = Column(Integer, ForeignKey('bs.id'), primary_key=True, nullable=True)
    text = Column(UnicodeText, nullable=False)
    # ...

そして、次のようなクエリを使用します。session.query(Comment).filter_by(a=whatever)

a_idb_idが同時にないように、ある種の制約を追加できると思いますNULLか?

これを行う別の方法があります(これが標準的な方法かどうかはわかりませんが、うまくいくはずです...

class Letter(Base):
    id = ...

class A(Base):
    letter_id = Column(Integer, ForeignKey('letters.id'), primary_key=True, nullable=False)
    # ...

class Comment(Base):
    letter_id = Column(Integer, ForeignKey('letters.id'), primary_key=True, nullable=True)
    # ...
于 2012-04-16T15:18:00.693 に答える