개요
golang을 통해 MySQL의 데이터베이스에 쿼리를 날리는 방법을 알아본다.
필요 모듈
DB의 연동과 관련된 database/sql 모듈과 MySQL 드라이버인 go-sql-driver/mysql 모듈을 임포트한다.
드라이버는 기본 모듈이 아니므로 go get github.com/go-sql-driver/mysql 명령을 통해 먼저 다운로드 한다.
golang에서는 import 순서가 중요하므로 database/sql이 sql드라이버보다 앞서서 선언되어야한다.
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "log" )
DB 연동
golang에서의 DB 연동은 별도의 datasource를 설정 하는 과정 없이, db 접속 정보만 가지고 진행할 수 있다.
연동을 편리하게 하기 위해 DB 정보를 담은 구조체를 만든다.
type dbInfo struct { user string pwd string url string engine string database string }
아래와 같이 db 정보를 초기화하여 선언한다.
var db1 = dbInfo{"root","mypassword","localhost:3306","mysql","test"}
쿼리를 날릴 함수를 작성한다.
dataSource는 DB와 애플리케이션간의 커넥션을 설정할 때, sql 드라이버가 알아들을 수 있는 모양으로 DB 접속 정보를 작성한다. 실제로 정보를 주입하면 root:mypassword@tcp(localhost:3306)/test 의 형태로 주어진다.
DB 엔진 정보와 접속 정보를 입력하면 connection이 생긴다.
func dbQuery(db dbInfo,query string) (count int) { dataSource := db.user+":"+db.pwd+"@tcp("+db.url+")/"+db.database conn,err := sql.Open(db.engine,dataSource)
golang의 nil은 null을 의미한다. sql.Open을 호출해서 어떤 에러가 반환되면 Fatal 로그를 남긴다.
defer은 Java의 finally 블럭과 같이 function이 다 끝났을 때 수행할 행동을 정의한다. connection을 닫아줄 수 있도록 conn.Close()를 호출하도록 작성한다.
if err != nil { log.Fatal(err) } defer conn.Close()
conn.QueryRow(query)를 통해 쿼리를 수행한다. query의 값은 SQL문을 그대로 사용할 수 있으며, placeholder의 경우 DB 엔진마다 다르다.(MySQL:?, Postgres:$1 등)
Scan(&colname)은 해당 row의 Column 이름을 찾겠다는 의미이다. SELECT COUNT(*) 등의 쿼리를 수행했을 경우 &count로 값을 받을 수 있다.
connection과 마찬가지로 Query 수행 중 에러 발생 시 행동을 if err != nil 블럭 내부에 선언할 수 있다.
err = conn.QueryRow(query).Scan(&count) if err != nil { log.Fatal(err) } fmt.Println(count) return count }
main 함수에서 쿼리를 수행하면 쿼리 결과를 얻을 수 있다.
func main() { result := dbQuery(db1,query) print(result) }
go run dbMonitoring.go Query Result: 3