PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So geben Sie die ursprüngliche Zeile in Postgres zurück, wenn eine eindeutige Einschränkung verletzt wird

Dies ist eigentlich nicht in einer einzigen Abfrage möglich, Sie müssen eine Funktion verwenden, um die ursprüngliche Zeile zu überprüfen, ob es genau das ist, was Sie dann in Python tun. Weitere Informationen finden Sie in der postgresql-Dokumentation

Wenn Sie das gewünschte Verhalten in Postgresql anstelle von Python ausführen möchten, können Sie eine pgplsql-Funktion ausführen, die Ausnahme abfangen und SELECT ausführen Anweisung (einige Fragen zu dieser Lösung:this und dies )

Bearbeiten Dies könnte die alternative pgplsql-Lösung sein:

CREATE OR REPLACE FUNCTION udf_insert_row(
    param_email varchar)
  RETURNS integer AS
$BODY$

DECLARE
    result integer;

BEGIN
  /*
  -- To Test:
    SELECT udf_insert_row('[email protected]'); will return 1
    SELECT udf_insert_row('[email protected]'); will return 2
    SELECT udf_insert_row('[email protected]'); will return 1
  */

  BEGIN
      INSERT INTO your_table(
        email
        ) 
      VALUES (
        param_email
      ) RETURNING id INTO result;
  EXCEPTION WHEN unique_violation THEN
      SELECT 
        id INTO STRICT result
      FROM 
        your_table 
      WHERE 
        email = param_email;
  END;  

    RETURN result;

END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION udf_insert_row(varchar)
  OWNER TO postgres;

Dann können Sie in Python die Funktion so aufrufen:

pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")

Sie können dies als gültige Antwort akzeptieren, wenn es nützlich ist