หัด Golang part 3
เชื่อมต่อฐานข้อมูล MS SQL Server (2017) ด้วย database/sql package
เชื่อว่าในเครื่องของเพื่อนๆคงมีฐานข้อมูลประเภท SQL สักตัวติดตั้งไว้ และคงได้เขียนเชื่อมต่อด้วยภาษาอื่นที่ไม่ใช่ Golang มาบ้าง ฉะนั้น part นี้เราจะมาเขียน Golang เชื่อมต่อกับฐานข้อมูลในเครื่อง โดยเครื่องของผมมี MS SQL Server ที่ติดตั้งผ่าน Docker เอาไว้แล้ว
Docker: microsoft/mssql-server-linux
ความเดิมจาก part ก่อน
ผมได้เขียน GET /books ง่ายๆไวๆแบบวัยรุ่นชอบ หนนี้ผมจะเขียน CRUD โดยเชื่อมต่อกับฐานข้อมูลเจ้ากรรมที่ได้นำเสนอไป
เมื่อค้นด้วย Google ก็ได้ว่า package ชื่อ database/sql (รายละเอียด) เป็น interface ทำหน้าที่รับผิดชอบเรื่องเชื่อมต่อกับฐานข้อมูล โดยเราจะต้องเลือก driver ที่จะคุยกับฐานข้อมูลให้ถูกต้องด้วยนะ
The sql package must be used in conjunction with a database driver. See https://golang.org/s/sqldrivers for a list of drivers.
จึงได้ตัวนี้มาครับ
สามารถใช้คำสั่ง go get ดึงลงมาจาก internet ได้เลย แต่ช้าก่อน ไปสร้างโปรเจกต์ใหม่กันก่อนดีกว่า
Create bookdb Project
กลับไปที่ folder หลัก ซึ่งผมตั้งชื่อมันว่า go
จากนั้นสร้าง folder ใหม่ชื่อ bookdb ไว้ภายใต้ go folder
จากนั้นสร้างไฟล์ main.go
ไหนลอง say Hello หน่อย
go run main.go
Load Driver
ดึงมันลงมาด้วย go get
go get github.com/denisenkom/go-mssqldb
ของที่ได้มานี้จะถูกเก็บไว้ที่
<ขื่อ user>/go/src/github.com
Connect Database
มี function ที่สำคัญของ database/sql ที่ควรรู้จักก่อนดังนี้
func Open(driverName, dataSourceName string) (*DB, error)
- driverName เชื่อมต่อฐานข้อมูลด้วยการระบุชื่อ driver ลงไป ของผมคือ mssql
- dataSourceName คือ connection string ซึ่งจะถูกสร้างโดยฟังก์ชัน Sprintf
func (db *DB) Close() error
ปิดการเชื่อมต่อซึ่งจะถูกใช้ร่วมกับคำสั่ง defer อันหมายความว่า ปิดการเชื่อมต่อหลังจากโปรแกรมได้ทำงานแล้วเสร็จ ในที่นี้ก็คือหลังคำสั่งสุดท้ายของฟังก์ชัน main
โค้ดทั้งหมด
rerun server ดูผลลัพธ์
Check Database Version
แค่นี้มันยังไม่พอ อยากรู้ว่าฐานข้อมูลที่ใช้นี้ (MS SQL Server) เวอร์ชันอะไร
func (db *DB) PingContext(ctx context.Context) error
ตรวจสอบว่า context นั้นยังทำงานอยู่หรือไม่ หากไม่ทำงานก็จะได้ error
func (db *DB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *Row
จะส่ง context ที่ทำงานอยู่เข้าไป แล้วก็จะเขียน query ดูเวอร์ชันของฐานข้อมูลนี้ โดยผลที่ได้คือ *Row ดังนั้นสามารถใช้ฟังก์ชัน Scan เพื่อนำค่า version ออกมาแสดงผล
สร้างฟังก์ชันใหม่ชื่อ checkVersion และสิ่งที่ต้องเพิ่มใน import คือ context package (รายละเอียด)
แล้วจึงเรียก checkVersion นี้ในบรรทุดสุดท้ายของฟังก์ชัน main พร้อมกับอย่าลืมใส่ตัวแปร db ลงไปด้วย
func main() { ... defer db.Close() checkVersion(db)}
rerun server ดูผลลัพธ์
ใครทำมาถึงตรงนี้ได้ทั้งที่เป็นมือใหม่แสดงว่ามีความอดทนสูงมาก เพราะสามารถทำได้โดยที่มีความเข้าใจน้อยมาก หรือบอกได้ว่าก๊อปวางอย่างเดียว (ขำ) ไม่เป็นไรครับ ให้เพิ่มการสังเกตเข้าไปในโค้ดอีกมากๆและก็ตามลิงก์ที่ผมแปะไว้เพราะมันเชื่อมโยงกับ document ของ Golang
โปรเจกต์นี้ผมสามารถเชื่อมต่อฐานข้อมูลได้แล้วและก็เหนื่อยแล้ว (ศึกษาไปด้วย อ่านไปด้วย เขียนสดๆไปด้วย) จึงขอ break เนื้อหาไว้เท่านี้ก่อน part ต่อไปค่อยมาทำ CRUD กันนะเพื่อนๆ