PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como retornar a linha original no Postgres ao violar uma restrição exclusiva


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