我有一個級聯刪除的問題。我有兩個表,和他們 映射許多一對多:將刪除級聯到多對多關聯表中?
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)
})
你想要什麼級聯:刪除File來刪除它的FileHost,刪除FileHost來刪除它的File還是兩者? – van 2010-07-13 10:52:19
當我刪除一個'File'時,它應該刪除'file_hosted'中的相應行。 – tom 2010-07-13 12:36:48
你能添加一個產生這個錯誤的代碼片段嗎? – van 2010-07-13 13:42:15