Умный каскад удаляет с помощью flask -sqlalchemy - PullRequest
0 голосов
/ 17 июня 2020

Может быть несколько PostAlias ​​для одного AliasLimit, и это ограничение с двумя ключами (vpost_id, alias_id), я хочу удалить PostAliases и ограниченный AliasLimit, только если он был последним связанным PostAlias:

 class AliasLimit(MyModel):
    __tablename__ = 'alias_limits'
    __table_args__ = (
        db.ForeignKeyConstraint(['alias_id', 'vpost_id'], ['post_aliases.alias_id', 'post_aliases.vpost_id'], ondelete='CASCADE', onupdate='CASCADE'),
        db.Index('al_alias_idx', 'alias_id', 'vpost_id'),
    )
    id = db.Column(db.Integer, primary_key=True)
    vpost_id = db.Column(db.Integer, nullable=False)
    alias_id = db.Column(db.Integer, nullable=False)
    offset = db.Column(db.Float, default=0.0)
    detection_threshold = db.Column(db.Float)
    warning_threshold = db.Column(db.Float)
    alarm_threshold = db.Column(db.Float)
    min = db.Column(db.Float)
    max = db.Column(db.Float)
    post_aliases = db.relationship('PostAlias',
                            primaryjoin='and_(AliasLimit.alias_id == PostAlias.alias_id, AliasLimit.vpost_id == PostAlias.vpost_id)', backref=db.backref('alias_limits', uselist=False), uselist=True)

class PostAlias(MyModel):
    __tablename__ = 'post_aliases'
    __table_args__ = (
        db.Index('postalias2limit_idx', 'alias_id', 'vpost_id'),
    )
    id = db.Column(db.Integer, primary_key=True)
    vpost_id = db.Column(db.ForeignKey('visual_posts.id', ondelete='CASCADE', onupdate='CASCADE'), nullable=False, index=True)
    alias_id = db.Column(db.ForeignKey('aliases.id', ondelete='CASCADE', onupdate='CASCADE'), nullable=False)
    post_id = db.Column(db.ForeignKey('posts.id', ondelete='CASCADE', onupdate='CASCADE'), nullable=False, index=True)
    sensor_id = db.Column(db.ForeignKey('sensors.id', ondelete='CASCADE', onupdate='CASCADE'), nullable=False, index=True)

Я вставляю данные вот так

obj = PostAlias(vpost_id=vpost_id,
                post_id=form.post.data,
                sensor_id=form.sensor.data,
                alias_id=form.alias.data)
db.session.add(obj)
db.session.flush()
if obj.alias_limits is None:
    obj.alias_limits = AliasLimit()
db.session.commit()

при удалении PostAlias ​​

PostAlias.query.filter_by(id=id).delete()
db.session.commit()

Linked AliasLimit каждый раз удаляется не только тогда, когда он был последним.

Если я изменяю действие ondelete, я получаю ошибку

sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`new`.`alias_limits`, CONSTRAINT `alias_limits_ibfk_1` FOREIGN KEY (`alias_id`, `vpost_id`) REFERENCES `post_aliases` (`alias_id`, `vpost_id`))
[SQL: DELETE FROM post_aliases WHERE post_aliases.id = %(id_1)s]
[parameters: {'id_1': 18}]

без db.ForeignKeyConstraint(['alias_id', 'vpost_id'], ['post_aliases.alias_id', 'post_aliases.vpost_id']), я не могу определить отношения

что мне делать ??? помогите плз

...