假设我有简单的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)中有什么方法可以实现?
答案 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
事件使用相同的模式,以防止子级删除。