PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come restituire la riga originale in Postgres dopo aver violato un vincolo univoco

Questo in realtà non è possibile farlo in una singola query, dovrai usare una funzione per controllare la riga originale, che è esattamente quello che stai facendo in Python. Puoi vedere maggiori informazioni nella documentazione postgresql

Se vuoi eseguire il comportamento dei desideri in postgresql anziché in Python, puoi eseguire una funzione pgplsql, catturare l'eccezione ed eseguire SELECT dichiarazione (alcune domande relative a questa soluzione:questo e questo )

Modifica Questa potrebbe essere la soluzione pgplsql alternativa:

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;

Quindi in Python, puoi chiamare la funzione in questo modo:

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

Puoi accettare questa come una risposta valida se è utile