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?
fuente
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.Respuestas:
Generando la "primera migración"
En su caso, la forma más confiable es hacerlo casi manualmente. Sugeriría utilizar la herramienta sequelize-cli . La sintaxis es bastante simple:
Esto creará tanto el modelo como la migración. Luego, combine manualmente sus modelos existentes con los generados con sequelize-cli, y haga lo mismo con las migraciones. Después de hacer esto, limpie la base de datos (si es posible) y ejecute
Esto creará un esquema de migraciones. Debe hacer esto solo una vez para cambiar al proceso adecuado de desarrollo de esquemas (sin sincronización: fuerza, pero con migraciones autorizadas).
Más tarde, cuando necesite cambiar el esquema:
sequelize migration:create
sequelize db:migrate
Ejecución de migraciones en producción
Obviamente, no puede enviar ssh al servidor de producción y ejecutar migraciones manualmente. Use umzug , herramienta de migración agnóstica de marco para Node.JS para realizar migraciones pendientes antes de que comience la aplicación.
Puede obtener una lista de migraciones pendientes / aún no ejecutadas como esta:
Luego ejecute migraciones ( dentro de la devolución de llamada ). El método de ejecución es una función de propósito general que ejecuta para cada migración especificada la función respectiva:
Y mi sugerencia es hacerlo antes de que la aplicación se inicie e intente servir rutas cada vez. Algo como esto:
No puedo probar esto ahora, pero a primera vista debería funcionar.
UPD Abr.2016
Después de un año, sigue siendo útil, así que comparto mis consejos actuales. Por ahora, estoy instalando el
sequelize-cli
paquete según la dependencia en vivo requerida , y luego modifico los scripts de inicio de NPM depackage.json
esta manera:Lo único que necesito hacer en el servidor de producción es
npm start
. Este comando ejecutará todas las migraciones, aplicará todas las sembradoras e iniciará el servidor de aplicaciones. No es necesario llamar a umzug manualmente.fuente
pending
y luegoexecute
y simplemente hacerumzug.up().then(function (migrations) { app.listen(3000); })
. Según la documentación de umzug, esto ejecutará todas las migraciones pendientes.Solo aprendí esto yo mismo, pero creo que recomendaría usar migraciones ahora para que te acostumbres. He descubierto que lo mejor para descubrir lo que sucede en la migración es mirar el sql en las tablas creadas por
sequelize.sync()
y luego construir las migraciones desde allí.Creará el archivo de migración de plantilla en un directorio de migraciones. Luego puede llenarlo con los campos que necesita crear. Este archivo deberá incluir
createdAt
/updatedAt
, campos necesarios para asociaciones, etc.Para la creación de la tabla inicial, debería tener:
Pero las actualizaciones posteriores a la estructura de la tabla pueden dejar esto fuera y solo usar alter table.
Un ejemplo de creación se vería así:
Para rehacer desde el principio:
Estoy usando café para ejecutar un archivo semilla para llenar las tablas después de:
Esto solo tiene una función de creación que se parece a:
Recuerde quitar su
sync()
índice de sus modelos o sobrescribirá lo que hacen las migraciones y las semillas.Los documentos están en http://sequelize.readthedocs.org/en/latest/docs/migrations/, por supuesto. Pero la respuesta básica es que debe agregar todo en usted para especificar los campos que necesita. No lo hace por ti.
fuente
sequelize.sync()
tener un script generado que cree todas las tablas e índices básicos como su primera migración (similar a los rielesschema.rb
). Después de leer esto, parece que su mejor opción podría ser exportar su esquema inicial como sql, luego póngalo en una granexec
declaración en su primera migración. Luego, desde allí, está ejecutando cambios incrementales en un punto de partida conocido como "versión 1.0".Para el desarrollo , ahora hay una opción para sincronizar las tablas actuales alterando su estructura. Usando la última versión del repositorio github de la secuencia , ahora puede ejecutar la sincronización con el
alter
parámetro.Una advertencia de los documentos:
fuente
Ahora con la nueva secuencia de migración, es muy simple.
Este es un ejemplo de lo que puedes hacer.
Recuerda que debes configurar:
"dialectOptions": { "multipleStatements": true }
en la configuración de la base de datos.
fuente
Usar versión La versión de la aplicación depende de la versión de la base de datos. Si la nueva versión requiere una actualización de una base de datos, cree una migración para ella.
actualización: decidí abandonar la migración ( KISS ) y ejecutar el script update_db (sync forse: false) cuando sea necesario.
fuente
sync()
nada y que necesito escribir manualmente las migraciones del esquema de los modelos de la versión anterior a los modelos de la versión más nueva?Un poco tarde, y después de leer la documentación, no necesita tener esa primera migración de la que está hablando. Todo lo que tiene que hacer es llamar
sync
para crear las tablas.sequelize.sync()
También puede ejecutar una sincronización de modelo simple haciendo algo como:
Project.sync()
pero creo quesequelize.sync()
es un caso general más útil para su proyecto (siempre que importe los buenos modelos en el momento de inicio).(tomado de http://sequelizejs.com/docs/latest/models#database-synchronization )
Esto creará todas las estructuras iniciales . Luego, solo tendrá que crear migraciones para evolucionar sus esquemas.
Espero eso ayude.
fuente
sequelize.sync()
lo que hace.Sequelize puede ejecutar SQL arbitrario de forma asincrónica .
Lo que haría es:
mysql_dump -uUSER -pPASS DBNAME > FILE.SQL
var baseSQL = "LOTS OF SQL and it's EVIL because you gotta put \ backslashes before line breakes and \"quotes\" and/or sum" + " one string for each line, or everything will break";
var baseSQL = fs.readFileSync('../seed/baseDump.sql');
Eso debería encargarse de configurar la base de datos, aunque lo asíncrono puede convertirse en un problema. Si eso sucede, buscaría una forma de diferir la devolución de la
up
función de secuencia hasta que finalice la función asíncronaquery
.Más sobre mysql_dump: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
Más sobre Sequelize Migrations: http://sequelize.readthedocs.org/en/latest/docs/migrations/
Más sobre Ejecutar SQL desde Sequelize Migration: https://github.com/sequelize/sequelize/issues/313
fuente
Aquí está mi flujo de trabajo actual. Estoy abierto a sugerencias.
De esa manera, no tiene que actualizar manualmente la tabla de migraciones y tener que preocuparse por los dedos gordos, pero aún así obtiene un ORM.
fuente
Amigo, tuve la misma pregunta y logré entender cómo usarlos.
Comencé sin la secuencia ORM, por lo tanto, ya tenía un modelo de datos.
Tuve que generar los modelos automáticamente con sequelize-auto y generar sus migraciones con este archivo que creas https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 y lo sincronizo (
{Force: false}
)Esto está en dev.Tendría que versión el modelo y las migraciones y las ejecuto cada vez que extraigo el código.
En producción, el servidor solo está arriba, por lo que solo tiene que ejecutar migraciones y en cada gestión de confirmación, ya que versionará el modelo sin detener el backend
fuente
Revisé esta publicación y preguntas similares, realmente no me respondió. Las migraciones son útiles para activar bases de datos locales y para actualizar datos en producción
Hice la pregunta aquí y también la respondí: ¿ Flujo de trabajo para manejar las migraciones e inicializaciones?
Versión TL-DR para un proyecto greenfield
.sql
archivosequelize init:migrate
en la carpeta dondemodels
estéssequelize migration:generate --name [name_of_your_migration]
con esta estructura general de carpetas
sequelize migration:generate --name [name_of_your_migration]
up
ydown
las vías de migración. Estas son sus declaraciones ALTER para cambiar los nombres de las columnas, ELIMINAR, AGREGAR columnas, etc.sequelize db:migrate
npm install sequelize-auto
.sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgres
encuentra en https://github.com/sequelize/sequelize-autoPuede usar git para ver los archivos de registro en su modelo, solo debe haber cambios que reflejen los cambios en el modelo de base de datos. Como nota al margen, nunca modifique
models
directamente si lo usasequelize auto
, ya que esto los generará para usted. Del mismo modo, ya no debe modificar su esquema de base de datos directamente con archivos SQL, dado que esta es una opción ya que puede importarlos.sql
archivosAhora el esquema de su base de datos está actualizado y se ha mudado oficialmente para secuenciar solo las migraciones de la base de datos.
Todo está controlado por la versión. Este es el flujo de trabajo ideal para desarrolladores de bases de datos y backend
fuente
Hay una forma aún más simple (evitando Sequalize). Lo que va así:
Escribe un comando dentro de su proyecto: npm run migrate: new
Esto crea 3 archivos. Un archivo js y dos archivos sql nombrados arriba y abajo
Para que esto funcione, eche un vistazo al módulo db-migrate .
Una vez que lo configura (lo que no es difícil), cambiar su base de datos es realmente fácil y ahorra mucho tiempo.
fuente