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)的区别