Sequelize.js: cómo usar las migraciones y la sincronización

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 a los 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.

Para ello, en la actualidad estoy corriendo.sync force: true cuando mi aplicación se inicie, si he cambiado las definiciones del modelo. Esto borra todas las tablas y las hace desde cero. Podría omitir elforce Opción para que solo cree nuevas tablas. Pero si los existentes han cambiado esto no es útil.

Entonces, una vez que agregué las migraciones, ¿cómo funcionan las cosas? Obviamente no quiero que se eliminen las tablas existentes (con datos en ellas), por lo quesync force: true está fuera de cuestió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 migrar para ejecutar cualquier migración pendiente. Pero en estas aplicaciones, la primera migración tiene una base de datos de esqueleto, con la base de datos en el estado en el que se encontraba en algún momento temprano en el desarrollo: la primera versión alfa o lo que sea. Así que 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 punto de la línea no tendrá una base de datos de esqueleto para ejecutar las migraciones, o se ejecutará sincronizada al inicio y hará que la base de datos esté en el nuevo estado con todos Las nuevas tablas, etc., pero cuando intenta ejecutar las migraciones, no tendrán sentido, ya que se escribieron con la base de datos original y cada iteración sucesiva en mente.

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) que la base de datos generada cuandosync force: true se ejecuta Esto se debe a que las descripciones del modelo en el código describen la estructura de la base de datos. Entonces, si no hay una tabla de migración, simplemente ejecutamos la sincronización y marcamos todas las migraciones como realizadas, aunque no se hayan ejecutado. ¿Es esto lo que tengo que hacer (cómo?), O se supone que Sequelize haga esto por sí mismo, ¿o estoy ladrando al árbol equivocado? Y si estoy en el área correcta, seguramente debería haber una buena forma de generar automáticamente la mayor parte de una migración, dados los modelos antiguos (¿por cometer hash? ¿O incluso podría cada migración estar vinculada a un compromiso? Admito que estoy pensando en un universo no portátil centrado en git) y los nuevos modelos. Puede diferenciar la estructura y generar los comandos necesarios para transformar la base de datos de antigua a nueva, y viceversa, y luego el desarrollador puede ingresar y hacer los ajustes necesarios (eliminar / transicionar datos particulares, etc.).

Cuando corro el binario secuela con el--init comando me da un directorio de migraciones vacío. Cuando luego corrosequelize --migrate me hace una tabla SequelizeMeta sin nada en ella, no hay otras tablas. Obviamente no, porque ese binario no sabe cómo arrancar mi aplicación y cargar los modelos.

Debo estar perdiendo algo.

TLDR: ¿cómo configuro mi aplicación y sus migraciones para poder actualizar varias instancias de la aplicación en vivo, así como una aplicación completamente nueva sin una base de datos de inicio heredada?

Respuestas a la pregunta(10)

Su respuesta a la pregunta