我有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的第一步)
答案 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。在大多数(可能是所有)数据库实现中,使用布尔值而不是整数(在适当的时候)可以提高内存效率。
我希望这会有所帮助。