typeorm:migration create on New Project Does Not Recognize Entities - “No changes in database schema were found - cannot generate a migration.”

Sep 06 2020

I'm having trouble creating the initial migration for a nestjs-typeorm-mongo project.
I have cloned this sample project from nestjs that uses typeorm with mongodb. The project does work in that when I run it locally after putting a "Photo" document into my local mongo with db named "test" and collection "photos" then I can call to localhost:3000/photo and receive the photo documents.

Now I'm trying to create migrations with the typeorm cli using this command:

./node_modules/.bin/ts-node ./node_modules/typeorm/cli.js migration:generate -n initial

... pero no funciona. No puedo crear una confirmación inicial, incluso después de configurar "sincronizar: falso" en mi app.module.tsarchivo, siempre aparece el error:

No se encontraron cambios en el esquema de la base de datos; no se puede generar una migración. Para crear una nueva migración vacía, use el comando "typeorm migration: create" cuando intente generar una migración ... 🤔

Aparte de cambiar sincronizar a falso, el único otro cambio que hice fue agregar un ormconfig.jsonarchivo en la raíz del proyecto ejecutando typeorm init --database mongodb:

{
   "type": "mongodb",
   "database": "test",
   "synchronize": true,
   "logging": false,
   "entities": [
      "src/**/*.entity.ts"
   ],
   "migrations": [
      "src/migration/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ],
   "cli": {
      "entitiesDir": "src",
      "migrationsDir": "src/migration",
      "subscribersDir": "src/subscriber"
   }
}

Respuestas

3 Willian Sep 20 2020 at 11:11

Una vez que esté usando MongoDB, no tiene tablas y no necesita crear sus colecciones con anticipación. Esencialmente, los esquemas MongoDB se crean sobre la marcha.

Debajo del capó, si el controlador es MongoDB, el comando typeorm migration:createse omite, por lo que es inútil en este caso. Puede comprobar usted mismo el PR # 3304 y el número 2867 .

Sin embargo, existe una alternativa llamada migrate-mongo que proporciona una forma de archivar una forma incremental, reversible y controlada por versiones para aplicar cambios de esquema y datos. Está bien documentado y desarrollado activamente.

ejemplo de migrate-mongo

Ejecutar npm install -g migrate-mongopara instalarlo.

Ejecutar migrate-mongo initpara iniciar la herramienta de migraciones. Esto creará un migrate-mongo-config.jsarchivo de configuración y una carpeta de migraciones en la raíz de nuestro proyecto:

|_ src/
|_ migrations/
   |- 20200606204524-migration-1.js
   |- 20200608124524-migration-2.js
   |- 20200808114324-migration-3.js
|- migrate-mongo.js
|- package.json
|- package-lock.json

Su migrate-mongo-config.jsarchivo de configuración puede verse así:

// In this file you can configure migrate-mongo
const env = require('./server/config')
const config = {
  mongodb: {
    // TODO Change (or review) the url to your MongoDB:
    url: env.mongo.url || "mongodb://localhost:27017",

    // TODO Change this to your database name:
    databaseName: env.mongo.dbname || "YOURDATABASENAME",

    options: {
      useNewUrlParser: true, // removes a deprecation warning when connecting
      useUnifiedTopology: true, // removes a deprecating warning when connecting
      //   connectTimeoutMS: 3600000, // increase connection timeout up to 1 hour
      //   socketTimeoutMS: 3600000, // increase socket timeout up to 1 hour
    }
  },

  // The migrations dir can be a relative or absolute path. Only edit this when really necessary.
  migrationsDir: "migrations",

  // The MongoDB collection where the applied changes are stored. Only edit this when really necessary.
  changelogCollectionName: "changelog"
};
module.exports = config;

Ejecutar migrate-mongo create name-of-my-scriptpara agregar un nuevo script de migración. Se creará un nuevo archivo con la marca de tiempo correspondiente.

/*
|_ migrations/
   |- 20210108114324-name-of-my-script.js
*/

module.exports = {
    function up(db) {
        return db.collection('products').updateMany({}, { $set: { quantity: 10 } }) } function down(db) { return db.collection('products').updateMany({}, { $unset: { quantity: null } })
    }
}

El registro de cambios de la base de datos: para conocer la versión actual de la base de datos y qué migración se debe aplicar a continuación, existe una colección especial que almacena el registro de cambios de la base de datos con información como las migraciones aplicadas y cuándo se aplicaron.

Para ejecutar sus migraciones, simplemente ejecute el comando: migrate-mongo up

Puede encontrar un ejemplo completo en este artículo Migraciones de esquemas de MongoDB en Node.js