Posterior a consultar expertos en este tema, programadores de diversas ramas y profesores hemos dado con la solución al problema y la plasmamos en este post.
Solución:
Tuviste que revertir una migración (knex migrate:rollback
) antes de eliminar el archivo, supongo que lo que puede hacer es:
touch [full_path_to_migrations_here]/migrations/20161110130954_auth_level.js
knex migrate:rollback
rm [full_path_to_migrations_here]/migrations/20161110130954_auth_level.js
Referencia aquí https://github.com/tgriesser/knex/issues/1569
Sus archivos de migración se eliminaron, pero aún se hace referencia a ellos en una tabla llamada “migraciones”.
(ver actualización a continuación), que fue generado por knex.
Debería poder comprobarlo conectándose a su base de datos local.
Enfrenté el mismo problema y lo resolví eliminando los registros correspondientes a mis archivos de migración eliminados.
delete from migrations
where migrations."name" in ('20191027220145_your_migration_file.js', ...);
EDITAR: El migraciones El nombre de la tabla puede cambiar según las opciones o la versión que utilice.
La constante se establece aquí y se usa allí.
Para estar seguro del nombre, puede enumerar todas las tablas como lo sugiere @MohamedAllal.
Espero eso ayude
Para retirar tampoco tú puedenRetroceder y así deshacer y luego quitar.
¡O no puedes! Y sigue el bramido:
(> A continuación, responda también el siguiente error que ya puede ver: <)
Error: el directorio de migración está dañado
Que pasará si
Los archivos de migración se eliminan, mientras que los registros de la tabla de migración creada por knex permanecen allí.
¡Así que simplemente límpialos!
(¡Quite y luego aclare, o aclare y luego elimine!)
Es importante tener en cuenta que la tabla de migración a estas alturas es knex_migration
. ¡No sé si fue diferente en el pasado!
¡Pero mejor enumere las tablas db para asegurarse!
¡Estoy usando postgres! Usando psql:
> d
yo obtengo :
¡Puedes hacerlo con Raw SQL! Usando su cliente de terminal db, ¡O usando knex mismo! O cualquier otro medio (un cliente editor (pgAdmin, mysql workbench, …).
SQL sin procesar
DELETE FROM knex_migration
WHERE knex_migration."name" IN ('20200425190608_yourMigFile.ts', ...);
Nota puede copiar más allá de los archivos del mensaje de error (si lo recibe)
ex: 20200425190608_creazteUserTable.ts, 20200425193758_createTestTestTable.ts
de
Error: el directorio de migración está dañado, faltan los siguientes archivos: 20200425190608_creazteUserTable.ts, 20200425193758_createTestTestTable.ts
¡Copiar y pegar! ¡Y es rápido!
(puede obtener el error al intentar migrar)
Usando knex en sí
knex('knex_migration')
.delete()
.whereIn('name', ['20200425190608_yourMigFile.ts', ...]);
¡Crea un guión! ¡Llame a su instancia de knex! ¡Hecho! ¡Frio!
Despues de limpiar
¡Las migraciones se ejecutarán muy bien! ¡Y su directorio no más corrupto! ¡Cuánto amo ese verde!
¡Feliz codificación!
Eliminación de una migración: (bájela y luego elimínela para eliminarla)
¿Cuál es la forma correcta de eliminar una migración?
¡La respuesta es bajar esa migración y luego eliminar su archivo!
Ilustración
$ knex migrate:down "20200520092308_createUsersWorksTable.ts"
$ rm migrations/20200520092308_createUsersWorksTable.ts
Puede enumerar las migraciones para verificar a continuación
$ knex migrate:list
(desde v0.19.3! Si no está disponible, actualice knex (npm i -g knex
))
Modificar la migración para modificar solo (No)
¡Si eres como yo y te gusta actualizar la migración directamente en la migración base! ¡Y puede pensar en crear una migración alternativa! ejecútelo y luego elimínelo!
¡Un flujo rápido! ¡Simplemente realice la actualización en la tabla de creación base! ¡Copie el pasado en la nueva tabla alter creada! ¡Ejecutarlo y luego eliminarlo!
¡Si estás pensando de esa manera! ¡¡¡No lo hagas !!!
usted no se puede revertir ¡porque son los cambios los que quieres! ¡No puedes cancelarlos!
¡Puedes hacerlo! ¡Y luego tienes que borrar los registros! ¡O obtendrás el error! ¡Y no es genial!
¡Es mejor crear un script de archivo posterior! ¡No es un archivo de migración! ¡Y ejecútelo directamente! ¡Hecho!
Mi preferencia es crear un alter.ts
(.js) en la carpeta de la base de datos. ¡Luego cree el código de esquema alterno allí! ¡Y crea un script npm para ejecutarlo!
¡Cada vez que lo modifiques! ¡Y correr!
Aquí el esqueleto base:
import knex from './db';
(async () =>
try
const resp = await knex.schema.alterTable('transactions', (table) =>
table.decimal('feeAmount', null).nullable();
);
console.log(resp);
catch (err)
console.log(err);
)();
Y mejor con vscode, solo uso el código de ejecución (si la extensión del código de ejecución está instalada, lo cual es imprescindible, hhhh).
Y si no hay errores, ¡funciona bien! ¡Y puedes comprobar la respuesta!
Puedes comprobar el api de esquema en el doc!
También a alterar necesitarás usar alter()
método como por el fragmento de abajo que tomé del documento:
// ________________ alter fields
// drops previous default value from column, change type
// to string and add not nullable constraint
table.string('username', 35).notNullable().alter();
// drops both not null constraint and the default value
table.integer('age').alter();
¡Feliz codificación!
Puntuaciones y comentarios
Nos puedes corroborar nuestro estudio dejando un comentario o dejando una valoración te lo agradecemos.