Ini sebenarnya tidak mungkin dilakukan dalam satu kueri, Anda harus menggunakan fungsi untuk memeriksa baris asli, bahwa itulah yang Anda lakukan saat itu dengan Python. Anda dapat melihat informasi lebih lanjut di dokumentasi postgresql
Jika Anda ingin melakukan perilaku keinginan di postgresql alih-alih Python, Anda dapat melakukan fungsi pgplsql, menangkap pengecualian dan melakukan SELECT
pernyataan (beberapa pertanyaan terkait dengan solusi ini:ini
dan ini
)
Sunting Ini bisa menjadi solusi pgplsql alternatif:
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;
Kemudian di python, Anda dapat memanggil fungsi seperti ini:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Anda dapat menerima ini sebagai jawaban yang valid jika bermanfaat