Това всъщност не е възможно да се направи в една заявка, ще трябва да използвате функция, за да проверите оригиналния ред, че това е точно това, което правите тогава в Python. Можете да видите повече информация в документацията за postgresql
Ако искате да изпълните поведението на желанието в postgresql вместо в Python, можете да направите функция pgplsql, да прихванете изключението и да направите SELECT
изявление (някои въпроси, свързани с това решение:това
и това
)
Редактиране Това може да е алтернативното pgplsql решение:
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;
След това в Python можете да извикате функцията по следния начин:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Можете да приемете това като валиден отговор, ако е полезно