Расположение каскадом удаления к many-many таблице ассоциации?

У меня есть проблема с расположением каскадом удаления. У меня есть две таблицы, и они отображаются many-many:

class File(object): pass 
file_table = Table('file', metadata, 
        Column('id', Integer, primary_key=True, autoincrement=True), 
        Column('filename', String(255)), 
} 

class FileHost(object): pass 
file_host = Table('host', metadata, 
        Column('id', Integer, primary_key=True, autoincrement=True ), 
        Column('name', String(255)), 
) 

file_hosted = Table('file_hosted', metadata, 
        Column('id_host', Integer, ForeignKey('host.id')), 
        Column('id_file', Integer, ForeignKey('file.id')) 
) 

session.mapper(File, file_table, properties={ 
    'host': relation(FileHost, secondary=file_hosted, backref='files', 
                        cascade='all,delete-orphan', single_parent=True) 
}) 
session.mapper(FileHost, file_host) 

Это - ошибка, которую я получаю:

sqlalchemy.exc.IntegrityError: 
(IntegrityError) update or delete on table "file" violates
foreign key constraint "file_hosted_id_file_fkey" on table "file_hosted" 
DETAIL:  Key (id)=(50905) is still referenced from table "file_hosted". 

Кто-либо понял, что я делаю неправильно?

Я также задал вопрос в sqlalchemy списке рассылки и получил правильный ответ:

Вы говорите, что SQLAlchemy для расположения каскадом Файла удаляет к FileHost, но Вы хотите его наоборот. Можно зафиксировать это путем перемещения каскада ='all, удалять-висячая-строка' и single_parent=True пункты в backref. Вы также, вероятно, хотите uselist=False.

session.mapper(File, file_table, properties={ 
    'host': relation(FileHost, 
                     backref=backref('files', 
                                     cascade='all,delete-orphan', 
                                     single_parent=True), 
                     secondary=file_hosted, 
                     uselist=False) 
}) 

8
задан tom 14 July 2010 в 21:18
поделиться