2010-07-12 149 views
6

我有一個級聯刪除的問題。我有兩個表,和他們 映射許多一對多:將刪除級聯到多對多關聯表中?

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

有沒有人有一個想法是什麼,我做錯了什麼?

我也問了這個問題on the sqlalchemy mailing list,並得到了正確的答案:

你告訴SQLAlchemy的級聯文件刪除到文件主機,但你 希望它周圍的其他方法。您可以通過將 級聯='all,delete-orphan'和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) 
}) 
+0

你想要什麼級聯:刪除File來刪除它的FileHost,刪除FileHost來刪除它的File還是兩者? – van 2010-07-13 10:52:19

+0

當我刪除一個'File'時,它應該刪除'file_hosted'中的相應行。 – tom 2010-07-13 12:36:48

+0

你能添加一個產生這個錯誤的代碼片段嗎? – van 2010-07-13 13:42:15

回答

4

應當指出的是,雖然這不是在這種特殊情況下的問題,你還可以,如果你不包括在你的外鍵的聲明ondelete="CASCADE"得到這個錯誤。即使在我的關係中聲明cascade="all,delete"後,我仍然收到此錯誤,直到我添加了ondelete屬性。您也可以添加onupdate="CASCADE"

+0

爲了澄清這一點..'ondelete =「CASCADE」'指示數據庫本身在外鍵上創建級聯刪除。 'cascade =「all,delete」'是sqlalchemy管理級聯的指令。查看此鏈接的綠色框:http://docs.sqlalchemy.org/en/latest/orm/cascades.html#delete – mafrosis 2017-08-24 10:36:20