Dit is eigenlijk niet mogelijk om in een enkele query te doen, je moet een functie gebruiken om de originele rij te controleren, dat het precies is wat je doet in Python. U kunt meer informatie vinden in de postgresql-documentatie
Als u het wensgedrag in postgresql in plaats van Python wilt uitvoeren, kunt u een pgplsql-functie uitvoeren, de uitzondering opvangen en de SELECT
uitvoeren verklaring (enkele vragen met betrekking tot deze oplossing:dit
en dit
)
Bewerken Dit zou de alternatieve pgplsql-oplossing kunnen zijn:
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;
Dan kun je in python de functie als volgt aanroepen:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
U kunt dit als een geldig antwoord accepteren als het nuttig is