Dette er faktisk ikke muligt at gøre i en enkelt forespørgsel, du skal bruge en funktion til at kontrollere den oprindelige række, at det er præcis, hvad du gør dengang i Python. Du kan se flere oplysninger i postgresql-dokumentationen
Hvis du vil udføre ønskeadfærden i postgresql i stedet for Python, kan du lave en pgplsql-funktion, fange undtagelsen og udføre SELECT
erklæring (nogle spørgsmål relateret til denne løsning:dette
og dette
)
Rediger Dette kunne være den alternative pgplsql-løsning:
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;
Så i python kan du kalde funktionen sådan her:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Du kan acceptere dette som et gyldigt svar, hvis det er nyttigt