Estoy cerca de tener mi proyecto listo para lanzar. Tengo grandes planes para después del lanzamiento y la estructura de la base de datos va a cambiar: nuevas columnas en las tablas existentes, así como nuevas tablas y nuevas asociaciones con modelos existentes y nuevos.
Todavía no he tocado las migraciones en Sequelize, ya que solo he tenido datos de prueba que no me importa borrar cada vez que cambia la base de datos.
Con ese fin, actualmente estoy ejecutando sync force: true
cuando se inicia mi aplicación, si he cambiado las definiciones del modelo. Esto elimina todas las tablas y las hace desde cero. Podría omitir la force
opción de crear solo nuevas tablas. Pero si los existentes han cambiado, esto no es útil.
Entonces, una vez que agrego las migraciones, ¿cómo funcionan las cosas? Obviamente no quiero que se eliminen las tablas existentes (con datos en ellas), así que sync force: true
está fuera de discusión. En otras aplicaciones que he ayudado a desarrollar (Laravel y otros marcos) como parte del procedimiento de implementación de la aplicación, ejecutamos el comando migrate para ejecutar cualquier migración pendiente. Pero en estas aplicaciones, la primera migración tiene una base de datos esqueleto, con la base de datos en el estado en el que se encontraba en algún momento temprano del desarrollo: la primera versión alfa o lo que sea. Entonces, incluso una instancia de la aplicación que llega tarde a la fiesta puede ponerse al día de una sola vez, ejecutando todas las migraciones en secuencia.
¿Cómo genero tal "primera migración" en Sequelize? Si no tengo una, una nueva instancia de la aplicación en algún momento no tendrá una base de datos esqueleto para ejecutar las migraciones o ejecutará la sincronización al inicio y hará que la base de datos esté en el nuevo estado con todos las nuevas tablas, etc., pero luego, cuando intenta ejecutar las migraciones, no tendrán sentido, ya que se escribieron teniendo en cuenta la base de datos original y cada iteración sucesiva.
Mi proceso de pensamiento: en cada etapa, la base de datos inicial más cada migración en secuencia debe ser igual (más o menos datos) a la base de datos generada cuando sync force: true
se corre. Esto se debe a que las descripciones del modelo en el código describen la estructura de la base de datos. Entonces, tal vez si no hay una tabla de migración, simplemente ejecutamos sync y marcamos todas las migraciones como hechas, aunque no se ejecutaron. ¿Es esto lo que tengo que hacer (¿cómo?), O Sequelize se supone que debe hacer esto por sí mismo, o estoy ladrando el árbol equivocado? Y si estoy en el área correcta, seguramente debería haber una buena manera de generar automáticamente la mayor parte de una migración, dados los viejos modelos (¿por hash de compromiso? ¿O podría cada migración estar vinculada a un compromiso? Reconozco que estoy pensando en un universo centrado en git no portátil) y los nuevos modelos. Puede diferenciar la estructura y generar los comandos necesarios para transformar la base de datos de lo antiguo a lo nuevo y viceversa, y luego el desarrollador puede entrar y hacer los ajustes necesarios (eliminar / cambiar datos particulares, etc.).
Cuando ejecuto la secuencia binaria con el --init
comando, me da un directorio de migraciones vacío. Cuando lo ejecuto sequelize --migrate
, me convierte en una tabla SequelizeMeta sin nada, ninguna otra tabla. Obviamente no, porque ese binario no sabe cómo iniciar mi aplicación y cargar los modelos.
Debo estar perdiendo algo.
TLDR: ¿cómo configuro mi aplicación y sus migraciones para que se puedan actualizar varias instancias de la aplicación en vivo, así como una nueva aplicación sin base de datos de inicio heredada?
sync
por ahora, la idea es que las migraciones "generen" toda la base de datos, por lo que confiar en un esqueleto es en sí mismo un problema. El flujo de trabajo de Ruby on Rails, por ejemplo, usa Migraciones para todo, y es bastante impresionante una vez que te acostumbras. Editar: Y sí, me di cuenta de que esta pregunta es bastante antigua, pero dado que nunca ha habido una respuesta satisfactoria y la gente puede venir aquí en busca de orientación, pensé que debería contribuir.