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/

For privacy reasons YouTube needs your permission to be loaded.
I Accept