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

Posted

技术标签:

【中文标题】typeorm:migration create on New Project Does Not Recognize Entities - “未发现数据库架构更改 - 无法生成迁移。”【英文标题】:typeorm:migration create on New Project Does Not Recognize Entities - "No changes in database schema were found - cannot generate a migration." 【发布时间】:2020-12-24 18:51:19 【问题描述】:

我在为 nestjs-typeorm-mongo 项目创建初始迁移时遇到问题。 我已经克隆了this sample project from nestjs that uses typeorm with mongodb。该项目确实有效,当我将“照片”文档放入本地 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”命令 尝试生成迁移时... ????

除了将 synchronize 更改为 false 之外,我所做的唯一其他更改是通过运行 typeorm init --database mongodb 在项目根目录中添加 ormconfig.json 文件:


   "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"
   

【问题讨论】:

你确定使用 mongodb 和 mongodb 需要迁移吗?我认为它总是在连接到 db 时创建数据库和集合,如果它不存在。 @spikie 当我将字段添加到数据模型时,它也不会创建任何迁移... 【参考方案1】:

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

在后台,如果驱动程序是 MongoDB,则命令 typeorm migration:create 会被绕过,因此在这种情况下它是无用的。您可以自行查看PR #3304 和Issue #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

【讨论】:

谢谢@Willian。我真的很期待能够使用来自 typeORM 的“生成”迁移,这将使我只专注于更改我装饰的 TypeScript 类。不幸的是,Migrate-mongo 迫使我手动编写所有 up 和 down 函数......我想如果这真的是唯一的选择,那么这就是我必须做的。 ?‍♂️

以上是关于typeorm:migration create on New Project Does Not Recognize Entities - “未发现数据库架构更改 - 无法生成迁移。”的主要内容,如果未能解决你的问题,请参考以下文章

Delphi Create(nil), Create(self), Create(Application)的区别

delphi7中create(nil)与create(self)区别

epoll_create和epoll_create1

epoll_create和epoll_create1

epoll_create和epoll_create1

link_to :action => 'create' 去索引而不是 'create'