hibernate - update - spring.datasource.initialization-mode options
¿Puede Flyway o Liquibase generar un script de actualización en lugar de actualizar la base de datos directamente? (5)
Primero, un poco de historia. Tengo un conjunto de aplicaciones Java, algunas basadas en JPA, otras no. Para crear mis bases de datos, actualmente estoy usando la exportación de esquemas de Hibernates para generar scripts para aquellos que usan JPA. Aquellos que no usan JPA genero los scripts a mano. Estos se ejecutan durante la instalación de la aplicación utilizando ANT. Para las actualizaciones, el instalador de la aplicación simplemente aplica los scripts de actualización a la base de datos.
Para mejorar la administración de las actualizaciones de la base de datos, he estado buscando en Flyway y Liquibase. Ambos parecen casi hacer lo que quiero (aparte: prefiero Flyway en este momento debido a todos los scripts SQL / DDL preexistentes que tenemos). El problema que puedo ver es que ambos actualizan la base de datos directamente. Esto está bien para muchas instalaciones pero no todas.
Lo que me gustaría hacer es ejecutar Flyway / Liquibase contra la base de datos y generar un script de actualización que incorpore todas las actualizaciones necesarias para actualizar la base de datos, incluidos los cambios que Flyway / Liquibase debe realizar en sus propias tablas. Esto me permitiría (o, lo que es más importante, un administrador de base de datos) ejecutar el script de actualización fuera de las aplicaciones para actualizar la base de datos. Luego podría usar Flyway / Liquibase dentro de mi aplicación únicamente para verificar que la base de datos está actualizada.
¿Es posible hacer esto con Flyway o Liquibase o cualquier otra herramienta?
La documentación de la herramienta de línea de comandos de Flyway dice que dryRunOutput
es una función de Flyway Pro que genera sentencias de SQL en un archivo específico.
Sí, generar un script SQL es una función incorporada para Liquibase. Otra área donde Liquibase tiene una ventaja sobre la ruta migratoria es su capacidad para migrar los cambios de código de la base de datos (paquetes, procedimientos y funciones). Utilizo la ruta migratoria, pero me encantaría tener esas funciones Liquibase disponibles en la ruta migratoria.
Tuvimos un problema similar cuando trabajé en una consultoría (Intelliware), por lo que los desarrolladores armaron un código y lo enviaron a GitHub.
Intentamos sin éxito incluirlo en el repositorio de Flyway.
Lo que quieres es una herramienta de diferencias de esquema . Recuerdo haber escuchado que TOAD tiene uno bastante poderoso. Hibernate también intentará generar scripts de actualización de esquema en función de las entidades que detecte y los metadatos de la base de datos.
Sin embargo, lo que necesita es ... no hacerlo y, en su lugar, utilizar Flyway para realizar todos los cambios en su base de datos. Es decir, debe desactivar las actualizaciones automáticas de esquema de Hibernates y escribir las actualizaciones de esquema usted mismo en el futuro. Cada vez que desee realizar un cambio en la base de datos, debe escribir una actualización de esquema.
Algunas personas capturan el resultado SQL de cómo hibernate la actualización del esquema como una forma de obtener actualizaciones automatizadas de la evolución del esquema. El problema es que la hibernación suele ser incorrecta, especialmente si se agrega una columna @NotNull
.
También en términos de su administrador, creo que Flyway puede generar resultados en función de su tabla schema_version y los scripts de migración de SQL / Java. El resultado de SQL se ejecutará, por lo que su DBA podría ejecutarse fuera de Flyway (de lo contrario, esta sería una característica fácil añadir).
Liquibase lo maneja bastante bien. Examina su base de datos en el estado actual, encuentra los conjuntos de cambios no aplicados y genera un script SQL con comando de update
en modo de salida de SQL .
El uso de una herramienta de migración de base de datos adecuada en lugar del generador de Hibernate es el camino a seguir en cualquier caso, tarde o temprano terminará con una situación que Hibernate no admite. Para nosotros fue eliminando un índice único y reemplazándolo con otro. También puede habilitar hibernate.hbm2ddl.auto=validate
para sentirse seguro acerca de la compatibilidad entre la estructura de la base de datos y los beans de entidad.