Detta är faktiskt inte möjligt att göra i en enda fråga, du måste använda en funktion för att kontrollera den ursprungliga raden, att det är exakt vad du gör då i Python. Du kan se mer information i postgresql-dokumentationen
Om du vill utföra önskebeteendet i postgresql istället för Python kan du göra en pgplsql-funktion, fånga undantaget och göra SELECT
uttalande (några frågor relaterade till den här lösningen:detta
och detta
)
Redigera Detta kan vara den alternativa pgplsql-lösningen:
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;
Sedan i python kan du anropa funktionen så här:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Du kan acceptera detta som ett giltigt svar om det är användbart