【问题标题】:SQLAlchemy one-to-many relationship (Single table with join table)SQLAlchemy 一对多关系(带连接表的单表)
【发布时间】:2016-08-29 20:35:32
【问题描述】:

我有无法修改的数据库,它有两个表“人”和“关系”。表“人”具有名称、ID 和父列(是/否)。表 'relation' 包含一个外键 'people.id' 代表父项,一个 'people.id' 代表它的子项。我想加入 people 表中的列,以便可以

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 的第一步)

【问题讨论】:

    标签: python 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 条目链接的列表(假设这是一对多关系)。

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

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

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

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2015-03-22
      • 2011-09-10
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多