5 python mysql sqlalchemy sql-delete
我想delete一个order从我的数据库,同时删除所有ordereditems,涉及到它.
with contextlib.closing(DBSession()) as session:
try:
returnedOrder = session.query(ORDER).filter_by(ORDERSID=orderID).first()
session.delete(returnedOrder)
session.commit()
except exc.SQLAlchemyError, error:
session.rollback()
raise_database_error(error)
else:
return '1'
Run Code Online (Sandbox Code Playgroud)
这是相关的classes(一些项目已被删除):
class ORDER(Base):
__tablename__ = 'ORDERS'
ORDERSID = Column(Integer, primary_key=True)
ORDERSCOST = Column(Numeric(19, 4), nullable=False)
ORDEREDITEM = relationship("ORDEREDITEM")
class ORDEREDITEM(Base):
__tablename__ = 'ORDEREDITEMS'
__table_args__ = (
Index('AK_ORDERSID_ITEMID', 'ORDERSID', 'ITEMSID', unique=True),
)
ORDEREDITEMSID = Column(Integer, primary_key=True)
ITEMSID = Column(ForeignKey(u'ITEMS.ITEMSID'), nullable=False, index=True)
ORDERSID = Column(ForeignKey(u'ORDERS.ORDERSID', ondelete=u'CASCADE'), nullable=False)
ORDEREDITEMSQUANTITY = Column(Integer, nullable=False)
ORDER = relationship(u'ORDER')
Run Code Online (Sandbox Code Playgroud)
该SQL文件中:
create table ORDERS
(
ORDERSID int not null auto_increment,
ORDERSCOST decimal(19,4) not null,
primary key (ORDERSID)
);
create table ORDEREDITEMS
(
ORDEREDITEMSID int not null auto_increment,
ORDERSID int not null,
ITEMSID int not null,
ORDEREDITEMSQUANTITY int not null,
primary key (ORDEREDITEMSID),
unique key AK_ORDERSID_ITEMID (ORDERSID, ITEMSID)
);
alter table ORDEREDITEMS add constraint FK_ORDER_ORDEREDITEM foreign key (ORDERSID)
references ORDERS (ORDERSID) on delete CASCADE on update restrict;
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到错误:
(IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`my_database`.`ordereditems`,
CONSTRAINT `FK_ORDER_ORDEREDITEM` FOREIGN KEY (`ORDERSID`) REFERENCES `ORDERS` (`ORDERSID`) ON DELETE CASCADE)')
'UPDATE `ORDEREDITEMS` SET `ORDERSID`=%s WHERE `ORDEREDITEMS`.`ORDEREDITEMSID` = %s' (None, 3L)
Run Code Online (Sandbox Code Playgroud)
当我直接在phpMyAdmin上执行相同的操作时,它按预期工作.
一个完整的工作示例通常是最有帮助的,但我能够填充示例中缺少的部分,并重现您确切的问题 - 在删除后尝试提交时尝试的UPDATE语句.(这里完全可以使用代码,所有纯python,没有SQL语句.)
这个问题在很多时候都被提出过,我在这个问题中找到了答案.
修复只是为了改变ORDEREDITEM关系
ORDEREDITEM = relationship("ORDEREDITEM")
Run Code Online (Sandbox Code Playgroud)
至
ORDEREDITEM = relationship("ORDEREDITEM", cascade="all,delete")
Run Code Online (Sandbox Code Playgroud)
请在此处查看sqlalchemy文档.
| 归档时间: |
|
| 查看次数: |
3295 次 |
| 最近记录: |