Javascript Sequelize can';我不能创建表,但当我在MySQL CLI中运行相同的表时,它可以工作
我正在使用sequelize,遇到了一个奇怪的错误:Javascript Sequelize can';我不能创建表,但当我在MySQL CLI中运行相同的表时,它可以工作,javascript,mysql,node.js,sequelize.js,Javascript,Mysql,Node.js,Sequelize.js,我正在使用sequelize,遇到了一个奇怪的错误: Executing (default): CREATE TABLE IF NOT EXISTS `groups` (`id` INTEGER NOT NULL auto_increment , `groupname` VARCHAR(255), `groupkey` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (
Executing (default): CREATE TABLE IF NOT EXISTS `groups` (`id` INTEGER NOT NULL auto_increment , `groupname` VARCHAR(255), `groupkey` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `username` VARCHAR(255) UNIQUE, `password` VARCHAR(255), `salt` VARCHAR(255), `token` VARCHAR(255), `group_id` INTEGER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`)) ENGINE=InnoDB;
Executing (default): CREATE TABLE IF NOT EXISTS `messages` (`id` INTEGER NOT NULL auto_increment , `message` VARCHAR(255), `group_id` INTEGER, `user_id` INTEGER, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`), FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) ENGINE=InnoDB;
Possibly unhandled SequelizeDatabaseError: ER_CANT_CREATE_TABLE: Can't create table 'crew.users' (errno: 150)
at module.exports.Query.formatError (/home/ubuntu/public/server/node_modules/sequelize/lib/dialects/mysql/query.js:160:16)
at Query._callback (/home/ubuntu/public/server/node_modules/sequelize/lib/dialects/mysql/query.js:38:23)
at Query.Sequence.end (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
at Query.ErrorPacket (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/sequences/Query.js:94:8)
at Protocol._parsePacket (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/Protocol.js:271:23)
at Parser.write (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/Parser.js:77:12)
at Protocol.write (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/Protocol.js:39:16)
at Socket.<anonymous> (/home/ubuntu/public/server/node_modules/mysql/lib/Connection.js:82:28)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:746:14)
Possibly unhandled SequelizeDatabaseError: ER_CANT_CREATE_TABLE: Can't create table 'crew.messages' (errno: 150)
at module.exports.Query.formatError (/home/ubuntu/public/server/node_modules/sequelize/lib/dialects/mysql/query.js:160:16)
at Query._callback (/home/ubuntu/public/server/node_modules/sequelize/lib/dialects/mysql/query.js:38:23)
at Query.Sequence.end (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
at Query.ErrorPacket (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/sequences/Query.js:94:8)
at Protocol._parsePacket (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/Protocol.js:271:23)
at Parser.write (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/Parser.js:77:12)
at Protocol.write (/home/ubuntu/public/server/node_modules/mysql/lib/protocol/Protocol.js:39:16)
at Socket.<anonymous> (/home/ubuntu/public/server/node_modules/mysql/lib/Connection.js:82:28)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:746:14)
下面是我如何定义表的:
var dbconfig = {};
dbconfig.database = process.env.database || 'crew';
dbconfig.username = process.env.username || 'root';
dbconfig.password = process.env.password || '';
dbconfig.hostname = process.env.hostname || 'localhost';
var sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password, {
host: dbconfig.hostname
});
var User = sequelize.define('users', {
username: {
type: Sequelize.STRING,
unique: true
},
password: Sequelize.STRING,
salt: Sequelize.STRING,
token: Sequelize.STRING,
group_id: {
type: Sequelize.INTEGER,
references: 'groups',
referencesKey: 'id'
}
});
var Message = sequelize.define('message', {
message: Sequelize.STRING,
group_id: {
type: Sequelize.INTEGER,
references: 'groups',
referencesKey: 'id'
},
user_id: {
type: Sequelize.INTEGER,
references: 'users',
referencesKey: 'id'
}
});
var Group = sequelize.define('groups', {
groupname: Sequelize.STRING,
groupkey: Sequelize.STRING
});
Group.sync({force: true});
User.sync({force: true});
Message.sync({force: true});
想出来了!!希望这能帮助其他人 因此,下面的命令基本上是异步操作,它们在不同的时间执行,导致sequelize失败,因为这些表依赖于其他表,执行顺序很重要
Group.sync({force: true});
User.sync({force: true});
Message.sync({force: true});
如果您在sequelize
上调用sync()
,而不是执行上述操作,那么sequelize确切地知道命令需要以什么顺序执行
sequelize.sync();
在看到这个之前我真的很困惑。现在它突然变得完全有意义了。在我刚刚学习如何使用Sequelize时,我确实帮了我的忙。每个模型都有单独的文件,所以我应该在哪里调用
Sequelize.sync()代码>@Argon调用输入文件(app.js)中的sequelize.sync()
sequelize.sync();