我正在学习 Sequelize.js 框架,它非常棒。但是,当我尝试从迁移文件中的测试表中删除列时,出现此错误:
ERROR: Cannot delete property 'meta' of [object Array]
当我从查询界面使用removeColumn函数时会发生此错误,但我不知道为什么......
我的迁移文件:
'use strict';
const {DataTypes} = require("sequelize");
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
return queryInterface.sequelize.transaction(t => {
return Promise.all([
queryInterface.removeColumn('Students', 'bloodStatus', {transaction: t}),
]);
});
},
async down (queryInterface, Sequelize) {
return queryInterface.sequelize.transaction(t => {
return Promise.all([
queryInterface.addColumn('Students', 'bloodStatus', {
type: DataTypes.STRING,
allowNull: false
}, {transaction: t}),
]);
});
}
};
我使用了上面的迁移文件,但出现错误
ERROR: Cannot delete property 'meta' of [object Array]
我阅读了文档并试图找到解决方案,但不幸的是我找不到。
虽然 Chipmaster5 的解决方案有效,但我认为如果您使用的是 mariadb 映像,那么使用 mysql 方言是一个坏主意。具体来说,这个问题似乎是由 mariadb 包的 v3 引入的,恢复到 2.x 为我解决了这个问题。
我找到了解决方案!我在 docker 容器(10.11.2-MariaDB-1:10.11.2+maria~ubu2204 - mariadb.org 二进制发行版)中使用 MariaDB,并且 config.json 中的方言设置为 mariadb,如下面的代码示例所示:
{
"development": {
"username": "christian_cornwall",
"password": "hogwarts",
"database": "hogwarts_sequelize",
"host": "172.17.0.3",
"dialect": "mariadb"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mariadb"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mariadb"
}
}
将方言设置更改为 mysql 后(如果您没有安装该软件包,它会要求您通过 npm 安装 mysql2),错误消失了,removeColumn 功能开始工作。我希望这会对某人有所帮助!
我收到此错误:
% node migrate.js
Running migrations...
{ event: 'migrating', name: '20230628090200-drop-column-id.js' }
Dropping column memberServiceId from table member_service_node
/myproject/node_modules/umzug/lib/umzug.js:151
throw new MigrationError({ direction: 'up', ...params }, e);
^
MigrationError: Migration 20230628090200-drop-column-id.js (up) failed: Original error: Cannot delete property 'meta' of [object Array]
at /myproject/node_modules/umzug/lib/umzug.js:151:27
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async Umzug.runCommand (/myproject/node_modules/umzug/lib/umzug.js:107:20)
at async file:///myproject/data/migrate.js:105:3 {
cause: TypeError: Cannot delete property 'meta' of [object Array]
at Query.formatResults (/myproject/node_modules/sequelize/lib/dialects/mariadb/query.js:110:7)
at Query.run (/myproject/node_modules/sequelize/lib/dialects/mariadb/query.js:73:17)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async /myproject/node_modules/sequelize/lib/sequelize.js:315:16
at async MySQLQueryInterface.removeColumn (/myproject/node_modules/sequelize/lib/dialects/mysql/query-interface.js:27:23)
直到支持 mariadb@3
npm install mariadb@2 --save
...为我解决了问题
在我的例子中,我通过使用原始查询(
queryInterface.sequelize.query([raw query]
)而不是“removeColumn”抽象来解决这个问题。