SQLAlchemy一对多关系(带连接表的单表)

时间:2016-08-29 20:35:33

标签: python sqlalchemy

我有db我无法修改,它有两个表'people'和'relation'。表'people'具有名称,ID和列父级(是/否)。表'relation'包含父项的外键'people.id'和子项的'people.id'。我想加入人员表中的列,以便

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 个答案:

答案 0 :(得分: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访问每个链接条目父级,您可以通过People.links获取每个人员条目链接的列表(假设这是一对多的关系)。

另外,如果People.parent应该表示一个布尔值,那么:

1。)您应该遵循标准命名约定并将其称为is_parent

2。)你应该将People.parent声明为db.Boolean类型,而不是db.Integer。在大多数(可能是所有)数据库实现中,使用布尔值而不是整数(在适当的时候)可以提高内存效率。

我希望这会有所帮助。