Sequelize คือ Object Relational Mapping (ORM) เป็นเครื่องมือที่ใช้สำหรับจัดการฐานข้อมูล Relational database ได้แก่ Postgres, MySQL, MariaDB, SQLite และ Microsoft SQL Server ซึ่งมีความสามารถในการ Query ข้อมูล เพิ่ม ลบ แก้ไข ฐานข้อมูลได้ มีฟังก์ชันการ Query ข้อมูลที่มี Relation กัน เรียกได้ว่าเราเขียนครั้งเดียวสามารถเอา code ไปใช้กับ Database ตัวไหนก็ได้เลยครับ
ติดตั้ง Sequelize
// เป็นการติดตั้ง sequelize ลงใน Project เรา npm install --save sequelize // เป็นการติดตั้ง Database Driver ของ sequelize โดยในที่นี้เลือก Database ให้ตรงกับที่เราใช้่โดยในตัวอย่างใช้เป็น mysql npm install --save mysql2 // ต่อมาเพื่อความสะดวกให้ติดตั้ง <strong>sequelize command line ก่อนจะได้เรียกใช้คำสั่งอื่นๆได้</strong> npm install -g sequelize-cli // หลังจากติดตั้ง cli แล้วเราก็จะใช้คำสั่งได้่ให้่ลองพิมพ์คำสั่งต่อไปนี้ เพื่อดูว่าเราสามารถใช้คำสั่งอะไรได้บ้าง sequelize // จากนั้นให้ลองสร้างไฟล์ตั้งต้นสำหรับการใช้งานด้วยคำสั่ง sequelize init // init project
จากนั้นไปแก้ไข User Pass สำหรับเชื่อต่อ Database ที่ ” ./config/config.json ”
การใช้งาน Model
การสร้าง Databse ให้ใช้คำสั่งโดยกำหนด TableName : ชื่อตาราง , columName : ชื่อคอลัมน์ที่ต้องการสร้าง , DataType : ชนิดของข้อมูล
// สร้าง model เพื่อกำหนดโครงสร้างฐานข้อมูล sequelize mode:generate --name TableName --attributes columName:DataType,columName:DataType // จากนั้นในไฟล์ js ให้รันคำสั่งนี้เพื่อ Sync Database sequelize.sync({ focre :true })
Config ข้อมูลต่าง
ข้างล่างคือตัวอย่างการกำหนดคอลัมน์ในฐานข้อมูล โดยสามารถกำหนด uuid สำหรับใช้งานได้ และยังกำหนด ในส่วนอนุญาติค่าว่าง หรือ คีย์ต่างๆได้ด้วย
uudi:{ type: DataTypes.UUID defaultValue: DataTypes.UUIDV4, allowNull: false, } id:{ allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }
การกำหนดรูปแบบการส่งค่ากลับ
ในตัวอย่างเป็นการ กำหนดค่าเพื่อไม่ให้ส่งบาง field กลับถ้าไม่งั้นตัวระบบจะส่งทุกอย่างที่ดึงจาก Database กลับไปหมด ในตัวอย่างจะเป็นการกำหนดไม่ให้ส่ง id กลับออกไป
toJson(){ return { ...this.get(), id: undefined} }
การ Query ค่าแบบมีเงื่อนไข
ใน sequelize เราไม่ต้องเขียน Query String แต่เรากำหนดเป็น Object แบบนี้ได้เลย
const uuid = req.params.uuid const user = await User.findOne({ where: { uuid } })
การ Relation
เราสามารถกำหนด Relation ในตารางอื่นได้ใน Model เลย
static associate({ modelName }){ // ถ้าไม่กำหนด config มันจะมองหา primary key ของ model นั้นเป็น default // ถ้ากำหนด config มันจะใช้ตาม config this.belongsTo( User, { fireignKey:'userId'}) } // เราสามารถกำหนดความสัมพันธ์ 1 to many ได้ด้วยคำสั่ง has many static associate({ modelName }){ this.hasMany( User, { fireignKey:'userId'}) }
ตัวอย่างการ Insert ข้อมูล
// เป็นตัวอย่างการ Query ช้อมูล แล้วเอาไป Insert const { userUuid, body } = req.body const user = await User.findOne({ where : {uuid : userUuid}}) const post = await Post.create({ body, userId : user.id})
ตัวอย่างการ Join ข้อมูล
// เอาค่า model อื่นมา join const posts = await Post.findAll({ include:[ModelName]}) // กำหนดค่าตอน Join ได้ const posts = await Post.findAll({ include:[model : modelName, as: 'DefineName']}) ** ต้องตามไปแก้ Model ที่ ref ด้วย this.delongsTo(User, { foreignKey:'userId', as : 'defineName'})
ตัวอย่างการ Join ข้อมูล
validate:{ notNull: { msg: 'User must have a email'} notEmpty: { msg: 'Email must have a email'} isEmail: { msg: 'Must be a valid email'} } ** ควรตั้งเป็น Error 400 ถ้าใช้ Validate
ตัวอย่างการ Delete ข้อมูล
const user = await User.findOne({ where: { uuid}) await user.destroy()
ตัวอย่างการ Update ข้อมูล
const { name, email, role } = req.body const user = await User.findOne({ where : { uuid }}) user.name = name user.email = email user.role = role await user.save()
การสร้าง Seed File สำหรับสร้างข้อมูลตัวอย่าง
// ใช้คำสั่งนี้ เป็นตัวสร้าง seed file sequelize seed:generate --name seedname // หลังจากนั้นกำหนดข้อมูลใน Seed File await queryInterface.bulkInsert('users',[{ name: 'aaaa', email: 'a@m.com', uuid: '1111111', createdAt: '2020-11-01T16:30:07.592Z', updatedAt: '2020-11-01T16:30:07.592Z', }], { *Second Data want to insert* }) // Seed sequelize db:seed:all<br /><br />// Down seed all<br />sequelize db:seed:undo:all<br /><br />// Down Seed some file<br />sequelize db:seed:undo --name filename.js // down seed await queryInterface.blukDelete('model', null, {})
https://gist.github.com/vapurrmaid/a111bf3fc0224751cb2f76532aac2465
https://sequelize.org/
https://sequelize.org/