Sequelizeでテーブルを作成する際のエラー

実現したいこと

Node.jsのSequelizeでMySQLのデータベースにテーブルを作成したい

前提

Taskというモデルを定義して
Task.sync()を実行しようとすると
「todo.tasks doesn't exist」というエラーが発生していました。
エラー自体はモデルのタスク名を明示することで解決したのですがなぜかが分からないので質問させていただいています。

発生している問題・エラーメッセージ

Executing (default): DROP TABLE IF EXISTS `Tasks`; todo-api | Executing (default): CREATE TABLE IF NOT EXISTS `Tasks` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255) NOT NULL, `completed` TINYINT(1) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB; todo-api | node:internal/process/promises:288 todo-api | triggerUncaughtException(err, true /* fromPromise */); todo-api | ^ todo-api | todo-api | Error todo-api | at Query.run (/home/node/node_modules/sequelize/lib/dialects/mysql/query.js:52:25) todo-api | at /home/node/node_modules/sequelize/lib/sequelize.js:314:28 todo-api | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) todo-api | at async MySQLQueryInterface.createTable (/home/node/node_modules/sequelize/lib/dialects/abstract/query-interface.js:98:12) todo-api | at async Task.sync (/home/node/node_modules/sequelize/lib/model.js:942:7) todo-api | at async /home/node/models/tasks.js:20:5 { todo-api | name: 'SequelizeDatabaseError', todo-api | parent: Error: Table 'todo.tasks' doesn't exist todo-api | at Packet.asError (/home/node/node_modules/mysql2/lib/packets/packet.js:728:17) todo-api | at Query.execute (/home/node/node_modules/mysql2/lib/commands/command.js:29:26) todo-api | at Connection.handlePacket (/home/node/node_modules/mysql2/lib/connection.js:488:32) todo-api | at PacketParser.onPacket (/home/node/node_modules/mysql2/lib/connection.js:94:12) todo-api | at PacketParser.executeStart (/home/node/node_modules/mysql2/lib/packet_parser.js:75:16) todo-api | at Socket.<anonymous> (/home/node/node_modules/mysql2/lib/connection.js:101:25) todo-api | at Socket.emit (node:events:513:28) todo-api | at addChunk (node:internal/streams/readable:324:12) todo-api | at readableAddChunk (node:internal/streams/readable:297:9) todo-api | at Readable.push (node:internal/streams/readable:234:10) { todo-api | code: 'ER_NO_SUCH_TABLE', todo-api | errno: 1146, todo-api | sqlState: '42S02', todo-api | sqlMessage: "Table 'todo.tasks' doesn't exist", todo-api | sql: 'CREATE TABLE IF NOT EXISTS `Tasks` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255) NOT NULL, `completed` TINYINT(1) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;', todo-api | parameters: undefined todo-api | }, todo-api | original: Error: Table 'todo.tasks' doesn't exist todo-api | at Packet.asError (/home/node/node_modules/mysql2/lib/packets/packet.js:728:17) todo-api | at Query.execute (/home/node/node_modules/mysql2/lib/commands/command.js:29:26) todo-api | at Connection.handlePacket (/home/node/node_modules/mysql2/lib/connection.js:488:32) todo-api | at PacketParser.onPacket (/home/node/node_modules/mysql2/lib/connection.js:94:12) todo-api | at PacketParser.executeStart (/home/node/node_modules/mysql2/lib/packet_parser.js:75:16) todo-api | at Socket.<anonymous> (/home/node/node_modules/mysql2/lib/connection.js:101:25) todo-api | at Socket.emit (node:events:513:28) todo-api | at addChunk (node:internal/streams/readable:324:12) todo-api | at readableAddChunk (node:internal/streams/readable:297:9) todo-api | at Readable.push (node:internal/streams/readable:234:10) { todo-api | code: 'ER_NO_SUCH_TABLE', todo-api | errno: 1146, todo-api | sqlState: '42S02', todo-api | sqlMessage: "Table 'todo.tasks' doesn't exist", todo-api | sql: 'CREATE TABLE IF NOT EXISTS `Tasks` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255) NOT NULL, `completed` TINYINT(1) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;', todo-api | parameters: undefined todo-api | }, todo-api | sql: 'CREATE TABLE IF NOT EXISTS `Tasks` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255) NOT NULL, `completed` TINYINT(1) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;', todo-api | parameters: {} todo-api | }

試したこと

モデル定義でタスク名を明示すると解決した。

補足情報(FW/ツールのバージョンなど)

テーブル名を明示しない場合Sequelizeでは予測機能みたいなものでモデル名を複数形に変換してテーブル名を定義するということは調べてなんとなくわかっています。
todo.tasksというのはデータベース名.テーブル名という認識ですが
そもそもテーブルを作成するための関数でテーブルがないと言われることが腑に落ちていません。また明示したことでなぜ解決したかも。

コメントを投稿

0 コメント