To vlastně není možné udělat v jednom dotazu, budete muset použít funkci pro kontrolu původního řádku, že je to přesně to, co děláte v Pythonu. Další informace naleznete v dokumentaci postgresql
Pokud chcete provést chování přání v postgresql místo Pythonu, můžete provést funkci pgplsql, zachytit výjimku a provést SELECT
prohlášení (některé otázky související s tímto řešením:toto
a toto
)
Upravit Toto by mohlo být alternativní řešení 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;
Pak v pythonu můžete funkci zavolat takto:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Můžete to přijmout jako platnou odpověď, pokud je to užitečné