【发布时间】:2019-09-27 09:26:25
【问题描述】:
我正在使用 MySQL 构建一个新的 NodeJS 应用程序。我需要使用现有的数据库模式。我有一个加载到数据库中的 mysql 转储文件(在 docker 容器中)。我正在尝试自动生成模型和迁移,然后成功运行迁移。我能够生成模型和迁移,但是运行生成的迁移时出现 SQL 语法错误。
以下是相关版本:
Node10-高山
"mysql": "^2.17.1",
"mysql2": "^1.6.5",
"sequelize": "^5.8.5",
"sequelize-auto": "^0.4.29",
"sequelize-auto-migrations": "^1.0.3"
我使用sequelize-auto 模块自动生成模型。这行得通。
sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u username -p 5432 -x password -e mysql
然后我尝试使用 sequelize-auto-migrations 模块生成迁移,然后自动运行它们。
生成初始迁移文件有效。
node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>
但是,在运行实际迁移时,会出现语法错误。
node ./node_modules/sequelize-auto-migrations/bin/runmigration
这适用于许多表,但随后会遇到语法错误。
code: 'ER_PARSE_ERROR',
errno: 1064,
sqlState: '42000',
sqlMessage:
'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \') ENGINE=InnoDB\' at line 1',
sql: 'CREATE TABLE IF NOT EXISTS `osw` () ENGINE=InnoDB;' },
sql: 'CREATE TABLE IF NOT EXISTS `osw` () ENGINE=InnoDB;' }
这里是相关的模型osw.js(由sequelize-auto模块生成):
/* jshint indent: 2 */
module.exports = function(sequelize, DataTypes) {
return sequelize.define('osw', {
OSWID: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: false,
primaryKey: true
},
IdentificationID: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: true,
references: {
model: 'itemidentification',
key: 'IdentificationID'
}
},
ProposedHours: {
type: DataTypes.DECIMAL,
allowNull: true
},
WorkStartDate: {
type: DataTypes.DATEONLY,
allowNull: true
},
WorkEndDate: {
type: DataTypes.DATEONLY,
allowNull: true
},
FormatID: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: true,
references: {
model: 'formats',
key: 'FormatID'
}
},
WorkLocationID: {
type: DataTypes.INTEGER(10).UNSIGNED,
allowNull: true
}
}, {
tableName: 'osw'
});
};
这里是mysql转储文件的相关部分:
CREATE TABLE `OSW` (
`OSWID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`IdentificationID` int(10) unsigned DEFAULT NULL,
`ProposedHours` decimal(10,2) DEFAULT NULL,
`WorkStartDate` date DEFAULT NULL,
`WorkEndDate` date DEFAULT NULL,
`FormatID` int(10) unsigned DEFAULT NULL,
`WorkLocationID` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`OSWID`),
KEY `OSW_FKIndex1` (`IdentificationID`),
KEY `OSW_Format` (`FormatID`),
CONSTRAINT `OSW_Format` FOREIGN KEY (`FormatID`) REFERENCES `formats` (`formatid`) ON DELETE SET NULL,
CONSTRAINT `OSW_Ident` FOREIGN KEY (`IdentificationID`) REFERENCES `itemidentification` (`identificationid`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1147 DEFAULT CHARSET=utf8 PACK_KEYS=0;
更新:我认为问题可能与自动生成的迁移有关。迁移文件似乎缺少列和字段类型定义,因此这可能是 SQL CREATE table 命令缺少列名的原因。以下是针对osw 表生成的迁移文件的相关部分:
var migrationCommands = [{
{
fn: "createTable",
params: [
"osw",
{
},
{}
]
}
];
【问题讨论】:
标签: mysql node.js model migration sequelize.js