es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué significa “Liquibase run part of a changeset?” en español?

Tengo el siguiente conjunto de cambios, pero podría querer agregar inserciones adicionales en el futuro. Podrían ser cientos o miles.

--changeset author:changesetid endDelimiter:;
INSERT INTO "MY_TABLE" (id, name) VALUES (1, 'bob');
INSERT INTO "MY_TABLE" (id, name) VALUES (2, 'jim');
INSERT INTO "MY_TABLE" (id, name) VALUES (3, 'mick');

No puedo ejecutar las inserciones anteriores porque eso generaría errores debido a que los datos ya existen. De manera similar, no quiero tener docenas o cientos de conjuntos de cambios individuales con su propia combinación de diferentes inserciones con el tiempo. Me gustaría consolidar todo en un solo conjunto de cambios.

Tal vez podría usar algún tipo de condición previa con este atributo, pero no querría seguir verificando el tamaño de la tabla (o tener que actualizar el valor de la condición previa) cada vez que necesite actualizar el conjunto de cambios.

--preconditions onFail:WARN
Tags:  ,

Answer

  1. Avatar for davy.ai

    Una solución es utilizar el atributo onFail de Liquibase en conjunto con una condición previa que verifique la existencia de los datos en cuestión.

    Primero, crea una condición previa que verifique si los datos ya existen en la tabla:

    <preconditions onfail="WARN">
        <sqlcheck expectedresult="0">SELECT COUNT(*) FROM MY_TABLE WHERE id = 1 AND name = 'bob'</sqlcheck>
        <sqlcheck expectedresult="0">SELECT COUNT(*) FROM MY_TABLE WHERE id = 2 AND name = 'jim'</sqlcheck>
        <sqlcheck expectedresult="0">SELECT COUNT(*) FROM MY_TABLE WHERE id = 3 AND name = 'mick'</sqlcheck>
    </preconditions>
    

    Esta condición previa verifica que no haya filas en MY_TABLE con combinaciones de id y name iguales a (1, 'bob'), (2, 'jim') y (3, 'mick'). Si alguna de estas verificaciones falla porque los datos ya existen en la tabla, Liquibase emitirá una advertencia en lugar de un error, permitiendo que el conjunto de cambios continúe ejecutándose.

    A continuación, modifica el conjunto de cambios para usar la condición previa:

    --changeset author:changesetid endDelimiter:;
    <preconditions onfail="WARN">
        <sqlcheck expectedresult="0">SELECT COUNT(*) FROM MY_TABLE WHERE id = 1 AND name = 'bob'</sqlcheck>
        <sqlcheck expectedresult="0">SELECT COUNT(*) FROM MY_TABLE WHERE id = 2 AND name = 'jim'</sqlcheck>
        <sqlcheck expectedresult="0">SELECT COUNT(*) FROM MY_TABLE WHERE id = 3 AND name = 'mick'</sqlcheck>
    </preconditions>
    INSERT INTO "MY_TABLE" (id, name) VALUES (1, 'bob');
    INSERT INTO "MY_TABLE" (id, name) VALUES (2, 'jim');
    INSERT INTO "MY_TABLE" (id, name) VALUES (3, 'mick');
    

    Este conjunto de cambios solo ejecutará las declaraciones INSERT si la condición previa se cumple. Si los datos ya existen, la condición previa fallará y el conjunto de cambios se omitirá sin generar un error.

    Para agregar inserciones adicionales en el futuro sin crear nuevos conjuntos de cambios, simplemente agrégalos al conjunto de cambios existente y actualiza la condición previa para verificar las nuevas combinaciones de datos.

Comments are closed.