Điều này thực sự không thể thực hiện trong một truy vấn duy nhất, bạn sẽ cần sử dụng một hàm để kiểm tra hàng ban đầu, rằng đó chính xác là những gì bạn đang làm sau đó trong Python. Bạn có thể xem thêm thông tin trong tài liệu postgresql
Nếu bạn muốn thực hiện hành vi mong muốn trong postgresql thay vì Python, bạn có thể thực hiện một hàm pgplsql, bắt ngoại lệ và thực hiện SELECT
tuyên bố (một số câu hỏi liên quan đến giải pháp này: this
và cái này
)
Chỉnh sửa Đây có thể là giải pháp pgplsql thay thế:
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;
Sau đó, trong python, bạn có thể gọi hàm như sau:
pgcur.execute("BEGIN")
args = ["[email protected]"]
pgcur.callproc("udf_insert_row",args)
result = pgcur.fetchone()
pgcur.execute("COMMIT")
Bạn có thể chấp nhận đây là một câu trả lời hợp lệ nếu nó hữu ích