Sequelize คือ Object Relational Mapping (ORM) เป็นเครื่องมือที่ใช้สำหรับจัดการฐานข้อมูล Relational database ได้แก่ Postgres, MySQL, MariaDB, SQLite และ Microsoft SQL Server ซึ่งมีความสามารถในการ Query ข้อมูล เพิ่ม ลบ แก้ไข ฐานข้อมูลได้ มีฟังก์ชันการ Query ข้อมูลที่มี Relation กัน เรียกได้ว่าเราเขียนครั้งเดียวสามารถเอา code ไปใช้กับ Database ตัวไหนก็ได้เลยครับ
ติดตั้ง Sequelize
[javascript]
// เป็นการติดตั้ง 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[/javascript]
จากนั้นไปแก้ไข User Pass สำหรับเชื่อต่อ Database ที่ ” ./config/config.json ”
การใช้งาน Model
การสร้าง Databse ให้ใช้คำสั่งโดยกำหนด TableName : ชื่อตาราง , columName : ชื่อคอลัมน์ที่ต้องการสร้าง , DataType : ชนิดของข้อมูล
[javascript]
// สร้าง model เพื่อกำหนดโครงสร้างฐานข้อมูล
sequelize mode:generate –name TableName –attributes columName:DataType,columName:DataType
// จากนั้นในไฟล์ js ให้รันคำสั่งนี้เพื่อ Sync Database
sequelize.sync({ focre :true })[/javascript]
Config ข้อมูลต่าง
ข้างล่างคือตัวอย่างการกำหนดคอลัมน์ในฐานข้อมูล โดยสามารถกำหนด uuid สำหรับใช้งานได้ และยังกำหนด ในส่วนอนุญาติค่าว่าง หรือ คีย์ต่างๆได้ด้วย
[javascript]
uudi:{
type: DataTypes.UUID
defaultValue: DataTypes.UUIDV4,
allowNull: false,
}
id:{
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
}
[/javascript]
การกำหนดรูปแบบการส่งค่ากลับ
ในตัวอย่างเป็นการ กำหนดค่าเพื่อไม่ให้ส่งบาง field กลับถ้าไม่งั้นตัวระบบจะส่งทุกอย่างที่ดึงจาก Database กลับไปหมด ในตัวอย่างจะเป็นการกำหนดไม่ให้ส่ง id กลับออกไป
[javascript]
toJson(){
return { …this.get(), id: undefined}
}[/javascript]
การ Query ค่าแบบมีเงื่อนไข
ใน sequelize เราไม่ต้องเขียน Query String แต่เรากำหนดเป็น Object แบบนี้ได้เลย
[javascript]
const uuid = req.params.uuid
const user = await User.findOne({
where: { uuid }
})
[/javascript]
การ Relation
เราสามารถกำหนด Relation ในตารางอื่นได้ใน Model เลย
[javascript]
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’})
}
[/javascript]
ตัวอย่างการ Insert ข้อมูล
[javascript]
// เป็นตัวอย่างการ Query ช้อมูล แล้วเอาไป Insert
const { userUuid, body } = req.body
const user = await User.findOne({ where : {uuid : userUuid}})
const post = await Post.create({ body, userId : user.id})
[/javascript]
ตัวอย่างการ Join ข้อมูล
[javascript]
// เอาค่า 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’})
[/javascript]
ตัวอย่างการ Join ข้อมูล
[javascript]
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
[/javascript]
ตัวอย่างการ Delete ข้อมูล
[javascript]
const user = await User.findOne({ where: { uuid})
await user.destroy()
[/javascript]
ตัวอย่างการ Update ข้อมูล
[javascript]
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()
[/javascript]
การสร้าง Seed File สำหรับสร้างข้อมูลตัวอย่าง
[javascript]
// ใช้คำสั่งนี้ เป็นตัวสร้าง 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, {})
[/javascript]
https://gist.github.com/vapurrmaid/a111bf3fc0224751cb2f76532aac2465
https://sequelize.org/
https://sequelize.org/