1

camelot (sqlalchemy ORM を使用) を使用してメンバー リストを保持するプログラムを作成しています。同じテーブル内で 1 対 1 の関係を意味する互いに結婚している人々がいるでしょう。これは Person クラスの簡易バージョンです。

class Person( Entity ):
    id = Column(Integer, primary_key=True)
    firstname = Column( Unicode(30), nullable = False )
    lastname = Column( Unicode(30), nullable = False )
    member_no = Column( Integer )
    marital_status = Column( Unicode(15) )
    marriage_date = Column( Date() )
    married_to = ... # Should be one to one with self

私はこれをやってみました:

married_to = relationship("Person", uselist=False, backref="persons")
married_to_id = Column(Integer, ForeignKey('persons.id'))

しかし、それは失敗します:

InvalidRequestError: 1 つ以上のマッパーが初期化に失敗しました - 他のマッパーの初期化を続行できません。元の例外は: Person.married_to と back-reference Person.persons はどちらも同じ方向です。多対一側に remote_side を設定するつもりでしたか?

どうすれば同じテーブル内に参加できますか、またはこれは私が使用している間違ったアプローチですか? そして、私がAさんとBさんをつなぐと、Bさんは自動的にAさんと合流します(結婚の仕事として-両方の方法で...)

私は自分自身を明確にしていることを願っています。:-/

4

3 に答える 3

3

隣接リスト関係が必要です。これが ドキュメントです。

ここでの relationship() 構成は、「通常の」1 対多の関係と同じように機能しますが、「方向」、つまり関係が 1 対多であるか多対 1 であるかは例外です。デフォルトでは 1 対多であると想定されています。多対 1 の関係を確立するために、remote_side と呼ばれる追加のディレクティブが追加されます。

多分試してください:

married_to = relationship("Person", remote_side=[id])
于 2013-02-04T21:57:52.597 に答える
2

私があなたの質問に答えているとは思いませんが、2 人の間の結婚は双方向性であるため、結婚だけを保持する別のテーブルを検討することをお勧めします。主キーは 2 つのperson_id参照。「開始」日と「終了」日を含めることで、このテーブルに履歴を保持するというアイデアを楽しむこともできます =)

于 2013-02-04T22:00:14.003 に答える
1

これがすべて同じテーブル内にある場合、外部キーは使用できません。外部キーは、定義上、他のテーブルからのキーです。

私はmarried_to列を使用して、お互いに結婚した人々がパートナーのそれぞれを持っているようにしますid. その後、クエリは非常に単純化されます。

于 2013-02-04T21:58:21.410 に答える