หัด Golang part 3

Phai Panda
2 min readSep 21, 2019

--

เชื่อมต่อฐานข้อมูล 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

โปรเจกต์ใหม่ชื่อ bookdb

ไหนลอง 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 กันนะเพื่อนๆ

--

--

No responses yet