Listen/Notify

Hallo liebe PG Leute,
ich habe eine frage. Und zwar habe ich eine Tabelle users in der Userdaten liegen.
Ale Beispiel folgende Tabelle:

uid|vorname|nachname|geburtsdatum|picture|zustimmung

Ich habe eine Funktion angelegt:


CREATE OR REPLACE FUNCTION notify_users()
  RETURNS trigger AS
$BODY$
    BEGIN
        --SELECT pg_notify('mymessage', 'fired by FUNCTION');
        NOTIFY users_changed, 'fired by NOTIFY';
        RETURN NULL;
    END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION notify_users() OWNER TO fhadmin;

Und ein Trigger

CREATE TRIGGER users_changed after insert or update or delete on users for each row execute procedure notify_users();

Ich habe dann ein Python Script geschrieben (Nach diesem Beispiel: More advanced topics — Psycopg v2.4.3.dev0 documentation)
das auf ein Notify wartet. Was auch funktioniert. Ich bekomme jetzt in dem Programm zurück, das sich ein Datensatz geändert hat:

NOTIFY: 1178 users_changed

Aber wie bekomme ich raus welcher Datensatz geändert wurde? Kann ich vielleicht den Primärschlüssel zurückgeben?

Welche Version?

Ab 9.0 kannst Du Payload mitgeben.


Andreas

Hi
danke für die schnelle Antwort, ja ich verwende gerade 9.0.4
hast du zufällig einen guten Info Link zu payloads? Oder einen Tipp wie ich das am besten verwende?

Doku?

Andreas

achso, das tue ich doch schon lange. es ist momentan ein String, nur wie bekomme ich dort den Primärschlüssel des Datensatzes rein? Damit ich nachher beim auswerten weiß welcher Datensatz es ist um damit weiterzuarbeiten.
python script:

print “Got NOTIFY:”, notify.pid, notify.channel, notify.payload

Ausgabe:

Got NOTIFY: 1178 users_changed fired by NOTIFY

Variable NEW. abfragen?


Andreas

sorry aber ich bin asoluter newbie ich habe etwas probiert was aber nicht funktioniert:

      DECLARE
         payload CHARACTER(5);   
      BEGIN
         payload := NEW.userid
        NOTIFY users_changed, payload;
        --RETURN NULL;
    END;

Hast Du den aktuellsten python-Treiber? Payload gibt es auch da noch nicht ewig …


Andreas

Hi, ne das muss an der deklaration von NEW liegen.
Ich habe den Code noch etwas abgeändert.

DECLARE
BEGIN
  PERFORM pg_notify('users_changed', TG_TABLE_NAME || ' UserID ' || NEW.userid );
  RETURN new;
END;

Es ist so drin. Es kommt der Syntrx Error:ERROR: record “new” has no field “userid”

Wenn ich das NEW.userid weglasse dann sieht die Zeile so aus:

PERFORM pg_notify('users_changed', TG_TABLE_NAME || ' UserID '  );

Dann bekomme ich das hier zurück im python script:

Got NOTIFY: 30296 users_changed users

und keinen Fehler in Postgres

Das heißt für mich das es an dem NEW Befehl NEW.userid liegt.
In python rufe ich postgres mit der Klasse psycopg2 das sollte der aktuellste sein.

Nach Deinem ersten Post heißt das Feld ja auch nicht “userid” sonder “uid”…

hi, leider habe ich das nur falsch hier hingeschrieben.
Ich würde mich freuen wenn das der Fehler gewesen wäre.

kleiner zwischenstand.
Bei anderen attributen z.b. vorname oder nachname funktioniert das einwandfrei.
Nur bei der uid die der Primärschlüssel ist nicht. :confused: