2016-08-29 85 views
0

我有db,我不能修改,它有兩個表'人'和'關係'。表'人'具有名稱,ID和列父(是/否)。表'關係'包含父項的外鍵'people.id'和子項的'people.id'。我想加入人名錶中的列,所以我可以SQLAlchemy一對多關係(單表與連接表)

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

通常你會想在同一個表中設置外鍵和backref,如下所示:

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項目鏈接的列表(假設這是一對多關係)。

而且,如果People.parent應該代表則布爾值:

1),你應該遵循標準的命名約定,並調用它像is_parent

2),你應該申報的人.parent作爲db.Boolean類型,而不是db.Integer。在大多數(可能全部)數據庫實現中,使用布爾代替整數(在適當的情況下)會提高內存效率。

我希望這有助於。