W rzeczywistości nie jest to możliwe do wykonania w jednym zapytaniu, będziesz musiał użyć funkcji, aby sprawdzić oryginalny wiersz, czy jest to dokładnie to, co robisz w Pythonie. Więcej informacji znajdziesz w dokumentacji postgresql
Jeśli chcesz wykonać zachowanie życzeń w postgresql zamiast w Pythonie, możesz wykonać funkcję pgplsql, złapać wyjątek i wykonać SELECT
oświadczenie (kilka pytań związanych z tym rozwiązaniem:to
i to
)
Edytuj To może być alternatywne rozwiązanie 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;
Następnie w Pythonie możesz wywołać funkcję w ten sposób:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Możesz zaakceptować to jako prawidłową odpowiedź, jeśli jest to przydatne