2010-07-12 4 views
6

Bir silme işleminde sorun yaşıyorum. İki tablo var ve bunlar birçok çoğa eşlenir:Çoktan çoğa ilişkilendirme tablosuna silmek mi istiyorsunuz?

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) 

Bu hata alıyorum edilir:

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". 

herkes yanlış yapıyorum bir fikrim var mı?

Ben de soru on the sqlalchemy mailing list sordu ve doğru cevabı var:

Sen SQLAlchemy Dosya filehost için siler basamakla anlatıyorsun, ama bunu tersi istiyorum. Sen = basamaklarını taşıyarak bu sorunu giderebilirsiniz 'hepsi,-yetim sil' backref içine ve single_parent = Doğru cümleleri. Muhtemelen 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) 
}) 
+0

tam olarak ne çağlayan istiyorum: 'Dosya' silinmesini onun 'File's veya her ikisini silmek' FileHost' onun 'FileHost', silme silmek? – van

+0

Bir "Dosyayı" sildiğimde, "file_hosted" içindeki uygun satırları silmeli. – tom

+0

Bu hatayı üreten bir kod snippet'i ekleyebilir misiniz? – van

cevap

4

Bu bu özel durumda sorun değildi iken yabancı anahtarların bildiriminde ondelete="CASCADE" dahil etmezseniz, hala bu hata mesajı alabilirsiniz unutulmamalıdır. Ben ondelete niteliğini eklendi kadar bile benim ilişkilerinde cascade="all,delete" ilan ettikten sonra, hala bu hatayı alıyordum. onupdate="CASCADE"'u da eklemek isteyebilirsiniz.

+0

Bu biraz açıklığa kavuşturmak için .. 'ondelete =" CASCADE "', yabancı anahtarlarda kaskatlı silmeler oluşturmak için DB kendisini yönlendirir. cascade = "all, delete" 'kademeli olarak yönetmek için sqlalchemy bir talimattır. Bu bağlantıdan aşağıya yeşil kutuya bakın: http://docs.sqlalchemy.org/en/latest/orm/cascades.html#delete – mafrosis