本文详细描述使用Django 的ORM框架操作PostgreSQL数据库删除不生效问题的定位过程及解决方案,并总结使用ORM框架操作数据库不生效的问题的通用定位方法
问题描述
最近使用Django 的ORM框架操作PostgreSQL数据库总是出现删除不生效(尤其是在并发的时候)。业务代码中也没有任何报错。
定位过程
- 首先,我们怀疑是SQL语句拼装错误(比如ID不对),导致了删除不生效
通过在Python日志中打印ORM框架的SQL以及返回的操作结果,发现delete操作返回的记录数是1。且SQL中的ID符合业务逻辑,说明相应SQL语句是执行成功的。排除了这条猜测
- 接着我们怀疑DELETE操作后,数据又被其他业务CREATE回来了
通过在数据库中增加触发器,将nfinst表的写操作记录到nfinst_audit表,发现没有删除操作。排除了这条猜测
create table nfinst_audit(
operation char(1) not null,
stamp timestamp not null,
userid text not null,
nfinstid text not null,
order_id SERIAL ,
addr text not null,
port text not null
);
--将DELETE、UPDATE、INSERT操作记录到nfinst_audit表中
create or replace function process_nfinst_audit() returns trigger as $nfinst_audit$
begin
if (TG_OP = 'DELETE') then
insert into nfinst_audit(operation,stamp,userid,nfinstid,addr,port) VALUES('D',now(),user,old.nfinstid,inet_client_addr(),inet_client_port());
return old;
elsif (TG_OP = 'UPDATE') then
insert into nfinst_audit(operation,stamp,userid,nfinstid,addr,port) VALUES('U',now(),user,new.nfinstid,inet_client_addr(),inet_client_port());
return new;
elsif (TG_OP = &#