Isso na verdade não é possível fazer em uma única consulta, você precisará usar uma função para verificar a linha original, que é exatamente o que você está fazendo no Python. Você pode ver mais informações na documentação do postgresql
Se você deseja executar o comportamento de desejo no postgresql em vez do Python, você pode fazer uma função pgplsql, capturar a exceção e fazer o
SELECT
declaração (algumas perguntas relacionadas a esta solução:isto
e isto
) Editar Esta poderia ser a solução alternativa do 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;
Então, em python, você pode chamar a função assim:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Você pode aceitar isso como uma resposta válida se for útil