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