SQLAlchemy一对多:限制父母生育至少一个孩子

时间:2019-05-06 07:23:51

标签: python sqlalchemy one-to-many

假设我有简单的SQLAlchemy映射:

class Parent(db.Model)
    id = db.Column(db.Integer, primary_key=True)
    children = db.relationship('Child', back_populates='parent')

class Child(db.Model)
    id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'), nullable=False)
    parent = db.relationship('Parent', back_populates='children')

在这种形式下,它是一个一对(父母)对很多(孩子)

由于每个nullable的{​​{1}}标志必须有一个Child,否则引发Parent。 [请注意,默认情况下不会级联'deletes'或'orphan-deletes',以确保在删除父级时也会删除其子级,因此会出现错误]

但是,当IntegrityError的孩子零个孩子时,我想举一个IntegrityError。 即:

  • 禁止创建新的Parent而不创建并指定至少一个Parent
  • 禁止删除Child的{​​{1}}集合中的最后一个Child

在Postgres(以及开发中的SQLite 3)中有什么方法可以实现?

1 个答案:

答案 0 :(得分:1)

要使其与数据库无关,可以在插入之前使用sqlalchemy事件检查父级:

from sqlalchemy import event


@event.listens_for(Parent, 'before_insert')
@event.listens_for(Parent, 'before_update')
def receive_before_insert_or_update(mapper, connection, parent):

    if not parent.children:
        # you should probably use your own exception class here
        raise IntegrityError("Parent without children not allowed")

这将防止插入或更新没有孩子的父母。您可以对before_delete事件使用相同的模式,以防止子级删除。