javascript - sequelize.sync(): შეცდომა SQL სინტაქსში NUMBER-ის სიახლოვეს
მე შევქმენი 4 Sequelize მოდელი sequelize.define();-ის გამოყენებით. მოდელები ძირითადად იგივეა, უბრალოდ განსხვავებული ცხრილის სახელებით. რადგანაც არ მინდოდა მათი ხელით შექმნა MySQL CLI-ში, გადავწყვიტე ჩემი main index.js ფაილში გამოყენება sequelize.sync(), რათა Sequelize შექმნიდეს ცხრილები, თუმცა როდესაც აპლიკაციას ვუშვებდი, მივიღე Unhandled rejection SequelizeDatabaseError: You have an error in your SQL syntax; შეცდომა და ცხრილები არ შექმნილა.
მე შევეცადე როგორც sequelize.sync(); ასევე sequelize.sync({ force: true }); და ასევე ვცადე მოდელების ინდივიდუალური სინქრონიზაცია, მაგრამ იგივე შეცდომა გამოჩნდა!
ჩემგანია ერთი მოდელი
export const Product = sequelize.define(
"product",
{
doInMyPlace: { type: Sequelize.BOOLEAN, allowNull: false },
address: { type: Sequelize.STRING, allowNull: false },
mapAddress: { type: Sequelize.STRING, allowNull: false },
date: { type: Sequelize.STRING, allowNull: false },
time: { type: Sequelize.STRING, allowNull: false },
voucher: { type: Sequelize.STRING, allowNull: true },
companyName: { type: Sequelize.STRING, allowNull: false },
phoneNumber: { type: Sequelize.STRING, allowNull: false },
itemCount: { type: Sequelize.NUMBER, allowNull: false }
},
{
freezeTableName: true
}
);
ნაჩვენები შეცდომა
Unhandled rejection SequelizeDatabaseError: 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 'NUMBER NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, P' at line 1
ჩაითვალა, რომ შეცდომა SQL სინტაქსის მიმართ არის, მაინტერესებდა ეს ჩემს კოდთან აქვს რაიმე კავშირი ან უბრალოდ sequelize-ს პრობლემაა.
გაფლეთილი შეცდომის დარჩენილი ნაწილი
at Query.formatError (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\dialects\mysql\query.js:244:16)
at Query.handler [as onResult] (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\dialects\mysql\query.js:51:23)
at Query.execute (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\mysql2\lib\commands\command.js:30:14)
at Connection.handlePacket (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\mysql2\lib\connection.js:408:32)
at PacketParser.Connection.packetParser.p [as onPacket] (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\mysql2\lib\connection.js:70:12)
at PacketParser.executeStart (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.Connection.stream.on.data (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\mysql2\lib\connection.js:77:25)
at Socket.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
From previous event:
at Query.run (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\dialects\mysql\query.js:39:12)
at runHooks.then.then (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\sequelize.js:643:29)
From previous event:
at Promise.try.then.connection (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\sequelize.js:643:12)
From previous event:
at Promise.resolve.retry (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\sequelize.js:639:10)
at C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\retry-as-promised\index.js:70:21
at new Promise (<anonymous>)
at retryAsPromised (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\retry-as-promised\index.js:60:10)
at Promise.try (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\sequelize.js:629:30)
From previous event:
at Sequelize.query (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\sequelize.js:578:23)
at promise.then (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\query-interface.js:236:46)
From previous event:
at QueryInterface.createTable (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\query-interface.js:236:20)
at Promise.try.then.then (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\model.js:1292:39)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
From previous event:
at Function.sync (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\sequelize\lib\model.js:1292:8)
at Object.<anonymous> (C:\Users\Amirali\Desktop\feature-2-authorization\models\products\product.ts:21:9)
at Module._compile (internal/modules/cjs/loader.js:776:30)
at Module._compile (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\source-map-support\source-map-support.js:521:25)
at Module.m._compile (C:\Users\Amirali\AppData\Local\Temp\ts-node-dev-hook-7490429646471359.js:56:25)
at Module._extensions..js (internal/modules/cjs/loader.js:787:10)
at require.extensions.(anonymous function) (C:\Users\Amirali\AppData\Local\Temp\ts-node-dev-hook-7490429646471359.js:58:14)
at Object.nodeDevHook [as .ts] (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\ts-node-dev\lib\hook.js:61:7)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:690:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.<anonymous> (C:\Users\Amirali\Desktop\feature-2-authorization\models\products\index.ts:4:1)
at Module._compile (internal/modules/cjs/loader.js:776:30)
at Module._compile (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\source-map-support\source-map-support.js:521:25)
at Module.m._compile (C:\Users\Amirali\AppData\Local\Temp\ts-node-dev-hook-7490429646471359.js:56:25)
at Module._extensions..js (internal/modules/cjs/loader.js:787:10)
at require.extensions.(anonymous function) (C:\Users\Amirali\AppData\Local\Temp\ts-node-dev-hook-7490429646471359.js:58:14)
at Object.nodeDevHook [as .ts] (C:\Users\Amirali\Desktop\feature-2-authorization\node_modules\ts-node-dev\lib\hook.js:61:7)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Module.require (internal/modules/cjs/loader.js:690:17)
at require (internal/modules/cjs/helpers.js:25:18)
ვეფობი შეკითხვას
Executing (default): CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255) NOT NULL, `phone` VARCHAR(255) NOT NULL, `gender` VARCHAR(255) NOT NULL DEFAULT 'm', `birthday` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME
NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
Executing (default): SHOW INDEX FROM `user`
Executing (default): CREATE TABLE IF NOT EXISTS `food` (`id` INTEGER NOT NULL auto_increment , `doInMyPlace` TINYINT(1) NOT NULL, `address` VARCHAR(255) NOT NULL, `mapAddress` VARCHAR(255) NOT NULL, `date` VARCHAR(255) NOT NULL, `time` VARCHAR(255) NOT NULL, `voucher` VARCHAR(255), `companyName` VARCHAR(255) NOT NULL,
`phoneNumber` VARCHAR(255) NOT NULL, `itemCount` NUMBER NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
პასუხი #1
თქვენ უნდა გამოიყენოთ INTEGER NUMBER-ის ნაცვლად. ასე:
itemCount: { type: Sequelize.INTEGER, allowNull: false }
როდესაც დოკუმენტაციას ვუყურებ, მონაცემთა ტიპი NUMBER არსად არის მითითებული. თუმცა, მე ვიპოვე ის, მაგრამ ის გამოიყენება მხოლოდ სხვა მონაცემთა ტიპებისთვის საწყის კლასად.
რაც შეეხება INTEGER, თქვენ გაქვთ შემდეგი:
Sequelize.INTEGER.UNSIGNED // INTEGER UNSIGNED
Sequelize.INTEGER(11).UNSIGNED // INTEGER(11) UNSIGNED
Sequelize.INTEGER(11).ZEROFILL // INTEGER(11) ZEROFILL
Sequelize.INTEGER(11).ZEROFILL.UNSIGNED // INTEGER(11) UNSIGNED ZEROFILL
Sequelize.INTEGER(11).UNSIGNED.ZEROFILL // INTEGER(11) UNSIGNED ZEROFILL
მთავარ საკითხში, თქვენი შეცდომა ხდება ამ ხაზის გამო 'itemCount' NUMBER NOT NULL, MYSQL-ში NUMBER ტიპი არ არსებობს.
პასუხი #2
Sequelize-ში მხარდაჭერილი მონაცემთა ტიპები:
https://sequelize.readthedocs.io/en/1.7.0/docs/models/
ამიტომ გამოიყენეთ INTEGER NUMBER-ის ნაცვლად.
