pythondjangopostgresqltriggerspostgresql-triggers

PostgreSQL OLD not working in after update statement level trigger


I'm trying to update course points by the sum of course's lessons points. It is working perfectly if I do select particular course ID like this:

BEGIN   

UPDATE course
SET points = (SELECT COALESCE(SUM("lesson"."points"), 0) AS "sum_points" FROM "course" LEFT OUTER JOIN "lesson" ON ("course"."id" = "lesson"."course_id") WHERE "course"."id" = 7) 
WHERE "course"."id" = 7;
RETURN NULL;
                
END;

But not working with OLD which is the updating instance. I want to update points of whichever course is being updated.

BEGIN   

UPDATE course
SET points = (SELECT COALESCE(SUM("lesson"."points"), 0) AS "sum_points" FROM "course" LEFT OUTER JOIN "lesson" ON ("course"."id" = "lesson"."course_id") WHERE "course"."id" = OLD."course_id")
WHERE "course"."id" = OLD."course_id";
RETURN NULL;
            
END;

I'm using django-pgtriggers: https://pypi.org/project/django-pgtrigger/

@pgtrigger.register(
    pgtrigger.Trigger(
        name="add_course_point",
        level=pgtrigger.Statement,
        when=pgtrigger.After,
        operation=pgtrigger.Update,
        func=f"""
            UPDATE course
            SET points = (SELECT COALESCE(SUM("lesson"."points"), 0) AS "sum_points" FROM "course" LEFT OUTER JOIN "lesson" ON ("course"."id" = "lesson"."course_id") WHERE "course"."id" = OLD."course_id")
            WHERE "course"."id" = OLD."course_id";
            RETURN NULL;
            """
    )
)

Solution

  • OLD and NEW are always NULL in case of Statement level. enter image description here

    Replace level=pgtrigger.Statement with level=pgtrigger.Row

    @pgtrigger.register(
        pgtrigger.Trigger(
            name="add_course_point",
            level=pgtrigger.Row,
            when=pgtrigger.After,
            operation=pgtrigger.Update,
            func=f"""
                UPDATE course
                SET points = (SELECT COALESCE(SUM("lesson"."points"), 0) AS "sum_points" FROM "course" LEFT OUTER JOIN "lesson" ON ("course"."id" = "lesson"."course_id") WHERE "course"."id" = OLD."course_id")
                WHERE "course"."id" = OLD."course_id";
                RETURN NULL;
                """
        )
    )
    

    or add referencing=pgtrigger.Referencing(old='old_table_name') and then modify your function.