mongodb - 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"
}
}
解决方案
一旦你使用了 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
推荐阅读
- javascript - 使用 dexie.js 更新表“主键”
- javascript - 如何获取和设置来自类的对象的样式属性?
- intellij-idea - 如何从命令行创建项目?
- c# - WPF文本框c#中的Shift-Enter(小)换行符
- django - 启动gunicorn时如何修复'ModuleNotFoundError:没有名为'mainpage'的模块'?
- c++ - 未自动确定的模板类型的隐式转换运算符
- elasticsearch - ElasticSearch 的雪球过滤器中的 German vs. German2
- javascript - 如何在 for...in 中获取嵌套对象属性的正确属性?
- google-cloud-platform - 谷歌云 API 和谷歌翻译网站给出不同的结果。如何获得相同的结果?
- c# - c# 脚本应该在悬停时更改文本颜色。脚本不是在游戏中改变颜色,而是在改变材质颜色