วิธีการใช้ TypeOrm ติดต่อ My SQL

Sommai Krangpanich
pnpsolution
Published in
3 min readJun 12, 2020
วิธีการใช้ TypeOrm ติดต่อ My SQL

เนื่องจากช่วงนี้มีหลายโปรเจ็คที่ขึ้นด้วย node.js และงานส่วนใหญ่เป็นระบบหลังบ้าน (enterprise software) ทำให้มีการยุ่งเกี่ยวกับ database ค่อนข้างมาก เลยอยากจะหา ORM ดีๆ สักตัวมาใช้งาน โจทย์แรกก็ตั้งใจว่าจะหาตัวที่มีความใกล้เคียงกับ Hibernate หรือ Spring JPA ลองผิดลองถูกอยู่หลาย product ก็มาถูกใจกับ TypeORM ตัวนี้ เนื่องด้วยตอบโจทย์สิ่งที่ต้องการนั่นก็คือ

  1. ใช้หลักการ annotation ซึ่งทีมงานมีความคุ้นเคย มันมีความคล้ายกับ Spring JPA มาก
  2. มีความสามารถ sync นั่นคือสร้าง entity ก่อนแล้วสามารถสั่งให้ไปสร้าง table ใน database ให้ได้
  3. สามารถเชื่อต่อ database ได้หลากหลาย เช่น MySQL, MS SQL, Oracle
  4. มีความสามารถ migration คือสามารถสร้าง script เพื่อให้ upgrade table ได้
  5. เป็น TypeScript อันนี้ค่อนข้างถูกใจทีมงานเพราะว่าทางทีมใช้ Angular อยู่ก็ลดการเรียนรู้ไปได้ค่อนข้างมาก อีกทั้ง TypeScript เหมาะกับการทำ Project ขนาดใหญ่เป็นอย่างมาก

ที่จริง TypeOrm มีความสามารถมากกว่านี้อีกมากนะครับแต่อันนี้คือตอบโจทย์สิ่งที่ทีมงานต้องการ เมื่อมันตอบโจทย์เราแล้วเราก็มาเริ่มใช้งานกันเลยดีกว่า อนึ่ง ต้องมี NodeJS ในเครื่องก่อนนะครับ

## ติดตั้ง typeorm cli กันก่อนนะครับnpm install -g typeorm## สร้าง project ในตัวอย่างชื่อ project ว่า simple-ormtypeorm init --name simple-orm --express## ติดตั้ง lib ด้วยคำสั่งดังนี้npm i

หลังจากสร้าง project เสร็จแล้วมาเปิดด้วย VSCode จะได้หน้าตาประมาณนี้นะครับ

โครงสร้าง project

โดย default ตัว typeorm cli นั้นจะติดตั้ง driver สำหรับ mysql มาให้เราแล้วส่วนท่านใดอยากใช้ driver อื่นก็สามารถติดตั้งได้ครับ

ต่อมาเราก็มาตั้งค่าการเชื่อต่อไป database เรา โดยสามารถแก้ไขได้ที่ file ormconfig.json ครับ

ormconfig.json

การตั้งค่าที่ต้องระวังคือ synchronize default เป็น true อันนี้หมายถึงเมื่อ run project ขึ้นมาจะทำการสร้าง database อิงตาม entity ที่เราสร้างไว้ เหมาะกับงาน dev ในเครื่องตัวเอง แต่ในกรณีที่ dev แบบมีเครื่อง database dev ตรงส่วนกลาง แนะนำให้ตั้งค่าเป็น false ครับ

ในกรณีที่ตั้งค่า synchronize เป็น false แต่เราต้องการให้ sync entity เรากับ database สามารถทำแบบ manual ผ่าน cli ได้ด้วยคำสั่งดังนี้ครับ

typeorm schema:sync

และตั้งค่า logging เป็น true เพื่อให้ตอน dev จะทำให้เห็น sql ที่ TypeOrm generate ออกมาเพื่อช่วยในการ debug

ต่อมาเรามาดู file ใน folder entity กัน file ใน folder นี้จะเป็นตัว map ระหว่าง node.js กับ database โดย map กันแบบ 1 table ต่อ 1 class ในตัวอย่าง file ที่ cli generate ออกมานั้นเราจะเห็นโครงสร้างดังภาพ

ตัวอย่าง entity

จากโครงสร้างตัวอย่างที่ทาง cli ให้มานั้นเป็นการ config แบบ default ทั้งหมด

@Entity() = อยู่ในส่วนบนของ Class ในกรณีที่ไม่ระบุ parameter จะใช้ชื่อ class เป็นชื่อ table@PrimaryGeneratedColumn() = อยู่ในส่วนของ field ในกรณีที่ไม่ระบุ parameter จะใช้ชื่อ field เป็นชื่อ column annotation นี้จะบอกว่า field นี้จะเป็น primary key ใน table แล้วเป็นแบบ auto running id@Column() = อยู่ในส่วนของ field ในกรณีที่ไม่ระบุ parameter จะใช้ชื่อ field เป็นชื่อ column และใช้ datatype อิงตาม class type

ตัวอย่างการใส่ parameter ใน entity

ตัวอย่างการใส่ parameter ใน entity

ในกรณีที่ต้องการสร้าง entity เพิ่มก็สร้าง file เพิ่มภายใต้ folder entity ได้เลยนะครับแนะนำว่าควรสร้างชื่อ file ชื่อเดียวกับชื่อ Class นะครับเพื่อความไม่งง และควรคล้องจองกับชื่อ table ด้วยนะครับโดยชื่อ file แนะนำเป็น camel case ครับส่วนชื่อ table แนะนำเป็น snake case นะครับ

เสร็จแล้วเราก็ไปสร้าง controller เพื่อให้โปรแกรมฝั่ง front end มาเรียกหาเราได้แบบ REST Api กันครับ

ตัวอย่าง file UserController

จากตัวอย่างที่ตัว cli generate ออกมานั้นเราก็จะเห็นว่าตัว TypeOrm เตรียม Repository มาให้เรียบร้อยแล้วเราสามารถเรียกใช้ Repository ได้ผ่าน method getRepository ได้เลย โดยตัว Repository ของ TypeOrm นั้นมี method CRUD มาครบถ้วนพร้อมให้เรียกใช้ได้เลย

หลังจากที่สร้าง controller แล้วก็นำ controller มาใส่ router ดังภาพ

ตัวอย่าง routes.ts

ในกรณีที่เพิ่ม controller ก็ต้องมาใส่เพิ่มที่ต้องนี้ด้วยนะครับ ส่วนบทความหน้าผมจะมาแนะนำวิธีการใช้ใน nest.js ให้นะครับ

เสร็จแล้วเราก็ start application เราด้วยคำสั่งดังนี้ครับ

npm start

เมื่อ start เสร็จแล้วก็สามารถเรียกใช้ api ที่เราสร้างขึ้นมาผ่าน url ดังนี้นะครับ

http://localhost:3000/users

เท่าที่ลองให้ TypeOrm มาในหลายโปรเจ็คก็มีความสะดวกดีและเมื่อรวมกับการใช้ ร่วมกับ Nest.js ยิ่งทำให้การทำงานมีความสะดวกรวดเร็วขึ้นกว่าเดิมมากทำให้ขึ้นโปรเจ็คได้เร็วกว่าการไล่เขียน sql statement เอง สำหรับท่านใดที่ลองทำตามแล้วไม่ได้ หรือว่าติดขัดอย่างไรสามารถเข้ามาพูดคุยแลกเปลี่ยนกันได้ที่ facebook : pnpsolutionหรือ web site : www.pnpsw.comได้ครับ

--

--