2016-08-29 5 views
0

私は変更できないdbを持っていますが、2つのテーブル 'people'と 'relation'があります。テーブル 'people'には、名前、ID、列の親(yes/no)があります。テーブル 'relation'には、親に対する外部キー 'people.id'とその子に対する 'people.id'が含まれています。私はできるだけ人々のテーブルの列に参加したいですSQLAlchemyの1対多リレーションシップ(1つのテーブルとジョインテーブル)

People.query.filter_by(id='id of the parent') 

親とその子の名前を取得する。

class People(db.model): 
    __tablename__ = 'people' 
    id = db.Column(db.integer(), primary_key=True 
    name = db.Column(db.String()) 
    parent = db.Column(db.Integer()) ##0 for no 1 for yes 
    parent_id=db.relationship('Link',backref=db.backref('Link.parent_id') 

class Link(db.Model): 
    _tablename__ = 'link' 
    parent_id=db.Column(db.Integer(),db.ForeignKey('people.id'),primary_key=True) 
    id = db.Column(db.Integer(), db.ForeignKey('people.id'), primary_key=True) 
    dateofbirth = db.Column(db.Integer()) 

SQLAlchemyのが私に語った:これは私のコードです

ArgumentError: relationship 'parent_id' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>) 

私が台無し場合は恐れ入りますが、それはここで私の最初の質問です(とSQLAlchemyのでも、最初のステップ)

答えて

1

通常、次のように、同じテーブルに外部キーとバックレファレンスを設定したいとします。

class Link(db.Model): 
    _tablename__ = 'link' 
    parent_id = db.Column(db.Integer(),db.ForeignKey('people.id'),primary_key=True) 
    parent = db.relationship('People', backref='links') 

これでLink.parentを介して各Linkエントリの親にアクセスでき、People.linksを介して各Peopleエントリのリンクのリストを得ることができます(これは1対多の関係です)。

またPeople.parentはその後、ブール値を表現することになっている場合、:

1)あなたは、標準の命名規則に従ってください、あなたは人々を宣言する必要があります)is_parent

2のような何かそれを呼び出します.parentはdb.Integerではなくdb.Boolean型です。ほとんどの(たぶんすべての)データベース実装では、整数の代わりにブール値を使用すると(適切な場合)メモリがより効率的になります。

私はこれが助けてくれることを願っています。

関連する問題