Einstellung löschen-Waise auf SQLAlchemy Beziehung führt zu AssertionError: Diese AttributeImpl ist nicht konfiguriert zu verfolgen Eltern

dies ist meine Flask-SQLAlchemy Deklarative code:

from sqlalchemy.ext.associationproxy import association_proxy
from my_flask_project import db


tagging = db.Table('tagging',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id', ondelete='cascade'), primary_key=True),
    db.Column('role_id', db.Integer, db.ForeignKey('role.id', ondelete='cascade'), primary_key=True)
)


class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, nullable=False)

    def __init__(self, name=None):
        self.name = name

    @classmethod
    def delete_orphans(cls):
        for tag in Tag.query.outerjoin(tagging).filter(tagging.c.role_id == None):
            db.session.delete(tag)


class Role(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='cascade'))
    user = db.relationship('User', backref=db.backref('roles', cascade='all', lazy='dynamic'))
    ...
    tags = db.relationship('Tag', secondary=tagging, cascade='all', backref=db.backref('roles', cascade='all'))
    tag_names = association_proxy('tags', 'name')

    __table_args__ = (
        db.UniqueConstraint('user_id', 'check_id'),
    )

Grundsätzlich, es ' s viele-zu-viele-Kennzeichnung mit Deklarativen. Beim löschen einiger Einträge aus-tagging, ich will SQLAlchemy zum Aufräumen des Waisen. Wie ich in Google docs, um dieses feature zu aktivieren, sollte ich dies tun:

class Role(db.Model):
    ...
    tags = db.relationship('Tag', secondary=tagging, cascade='all,delete-orphan', backref=db.backref('roles', cascade='all'))
    ...

Jedoch, eine solche Einstellung führt zu AssertionError: Diese AttributeImpl ist nicht konfiguriert zu verfolgen Eltern. Ich habe es gegoogelt und nichts gefunden, außer der opensourced code von SQLAlchemy. Daher habe ich die classmethod Tag.delete_orphans() (es ist im obigen code) aufrufen, um es jedes mal, wenn ich denke, einige Waisen, die auftreten konnten, aber das scheint nicht sehr elegant.

Irgendwelche Ideen oder Erklärungen, warum meine Einstellung mit delete-orphan funktioniert nicht?

Schreibe einen Kommentar