首页 > 解决方案 > typeorm:migration create on New Project Does Not Recognize Entities - “未发现数据库架构更改 - 无法生成迁移。”

问题描述

我在为 nestjs-typeorm-mongo 项目创建初始迁移时遇到问题。
我已经从使用 typeorm 和 mongodb 的 nestjs 克隆了这个示例项目。该项目确实有效,当我将“照片”文档放入本地 mongo 并使用名为“test”的数据库并收集“照片”之后在本地运行它时,我可以调用 localhost:3000/photo 并接收照片文档。

现在我正在尝试使用以下命令使用 typeorm cli 创建迁移:

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

...但它不工作。我无法创建初始提交 - 即使在我的app.module.ts文件中设置“同步:false”后,我总是会收到错误消息:

未发现数据库架构更改 - 无法生成迁移。要创建新的空迁移,请在尝试生成迁移时使用“typeorm migration:create”命令...

除了将同步更改为 false 之外,我所做的唯一其他更改是ormconfig.json通过运行在项目根目录中添加一个文件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"
   }
}

标签: mongodbdatabase-migrationnestjstypeorm

解决方案


一旦你使用了 MongoDB,你就没有表,也不需要提前创建你的集合。本质上,MongoDB 模式是动态创建的!

在后台,如果驱动程序是 MongoDB,则该命令typeorm migration:create会被绕过,因此在这种情况下它是无用的。您可以检查自己的PR #3304Issue #2867

但是,还有一种称为migrate-mongo的替代方法,它提供了一种归档增量、可逆和版本控制的方法来应用模式和数据更改。它有据可查并积极开发。

迁移 mongo 示例

运行npm install -g migrate-mongo安装它。

运行migrate-mongo init以初始化迁移工具。migrate-mongo-config.js这将在我们项目的根目录下创建一个配置文件和一个迁移文件夹:

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

您的migrate-mongo-config.js配置文件可能如下所示:

// 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;

运行migrate-mongo create name-of-my-script以添加新的迁移脚本。将创建一个带有相应时间戳的新文件。

/*
|_ 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 } })
    }
}

数据库变更日志:为了了解当前的数据库版本以及下一步应该应用哪个迁移,有一个特殊的集合存储数据库变更日志,其中包含应用迁移以及何时应用等信息。

在此处输入图像描述

要运行迁移,只需运行以下命令:migrate-mongo up

您可以在这篇文章中找到完整的示例MongoDB Schema Migrations in Node.js


推荐阅读