我有一个使用sequelize的应用程序,我们已经到了很多迁移的地步。我们决定,当我们创建新数据库时,我们想跳过迁移,而只是使用最新模型定义中的sequelize.sync
命令来构建数据库模式。我一直在测试这种方法,该命令按预期工作:
async function syncDb() {
const res = await db.sequelize.sync({ force: true });
process.exit();
}
但是问题是当我尝试运行播种器时,我收到有关模型中未定义的缺少列的错误,并且当我使用mysql工作台检查它们时它们也不在数据库中。例如,我们有一个名为“ practices”的表,该表具有许多列,但没有
createdAt
列。 mysql workbench中生成的表没有createdAt
列,并且timestamps选项设置为false。在我的种子文件中,执行bulkInsert:
return queryInterface.bulkInsert('practices', [
{ data },
etc...
]);
自然,bulkInsert中的数据字段没有任何createdAt字段,但是当我运行
sequelize db:seed:all --debug
时,我总是收到此烦人的错误消息== 20180515000000-实践:迁移=======
错误:SequelizeDatabaseError:字段“ createdAt”没有默认值
在Query.formatError(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/sequelize/lib/dialects/mysql/query.js:247:16)
在Query.handler上[作为onResult](/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/sequelize/lib/dialects/mysql/query.js:68:23)
在Query.execute(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/commands/command.js:30:14)
在Connection.handlePacket(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/connection.js:449:32)
在PacketParser.Connection.packetParser.p [如onPacket](/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/connection.js:72:12)
在PacketParser.executeStart(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/packet_parser.js:75:16)
在Socket.Connection.stream.on.data(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/connection.js:79:25)
在emitOne上(events.js:116:13)
在Socket.emit(events.js:211:7)
在addChunk(_stream_visible.js:263:12)
在readAddChunk(_stream_visible.js:250:11)
在Socket.Readable.push(_stream_visible.js:208:10)
在TCP.onread(net.js:597:20)
从输出来看,该错误并不能告诉我哪个种子播发器出现故障,看来到目前为止,种子播种器是唯一运行的实践。
所以我试图找出问题所在,因为在习俗表中没有
createdAt
,并且我没有插入任何createdAt
字段,所以我尝试注释掉整个种子文件的内容,但仍然得到错误...那怎么可能?播种机实际上并没有插入任何内容,现在看起来像这样:up: (queryInterface, Sequelize) => {
// empty
}
有没有办法找出正在运行的sql,还是有更好的方法来调试导致此错误的原因?
最佳答案
与文档bulkInsert中一样,我们可以传递类似于bulkCreate选项的其他选项。在bulkCreate选项中,我们可以指定要插入的字段(默认为所有字段)。
所以你可以这样使用
queryInterface.bulkInsert('practices', [{ data }], { fields: 'Array of all fields except createdAt' });