[Go+MySQL] Go에서 MySQL 사용하기
이번 포스팅은 Go에서 MySQL 데이터베이스를
연동하여 사용하는 예제에 관한 포스팅입니다.
필요한 패키지
database/sql
우선 기본적으로 내장되어 있는 database/sql 패키지를 사용한다.
DB연결과 DB에 query를 실행하기 위해 필요한 패키지
go-sql-driver/mysql
그리고 database/sql의 모든 API를 사용하기 위해 MySQL 드라이버가 필요하다.
Go의 내장 패키지인 database/sql/driver의 인터페이스를 구현한것
database/sql 내부에서 사용되는 드라이버 패키지
> 해당 깃허브의 번역 및 사용 참고자료 : soyoung-new-challenge.tistory.com/125
> 필요한 패키지 다운로드
$ go get -u github.com/go-sql-driver/mysql
필요한 패키지 Import
아래와 같이 MySQL DB 연결을 위해 필요한 패키지를 Import 한다.
방금 다운로드한 mysql-driver는 sql 패키지에서 내부적으로 사용하게 된다 / 직접적으로 사용하지 않음
따라서 직접적으로 사용하지 않기 때문에 import 후 앞에 _로 표시를 해준다
package mysql
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
DB 연결 선언
sql.Open()
sql.Open을 하면서 첫번째 파라미터로는 드라이버 명, 즉 'mysql'이라고 입력
두번째 파라미터로는 Connection String. 즉 DB 연결을 위한 정보를 입력한다.
여기서 sql.Open() 실행 시 실제 DB를 연결하는 것이 아니다.
실제 DB연결은 쿼리를 던지는 시점, 실제 DB연결이 필요한 시점에 이루어진다
defer db.Close()
꼭 defer를 사용해 db.Close()를 실행해야한다
그 외, 중요한 세팅 값에 대한 자세한 정보는 mysql-driver github 번역 포스팅 참고( soyoung-new-challenge.tistory.com/125 )
db, err := sql.Open("mysql", "[접속정보 입력]")
if err != nil {
panic(err)
}
// See "Important settings" section.
db.SetConnMaxLifetime(time.Minute * 3)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
fmt.Println("connect success", db)
defer db.Close()
Query 실행 - Select
mysql에서 쿼리를 보내기 위해 보통 2가지 메서드를 사용한다
QueryRow()
하나의 Row만 return 하는 경우, 즉 결과 값이 하나일 때
쿼리 실행 후, 결과인 하나의 Row에서 실제 데이터를 읽어 로컬 변수에 할당하기 위해 Scan() 메서드 사용
var name string
err = db.QueryRow("SELECT title FROM foodie WHERE idx=523").Scan(&name)
if err != nil {
log.Fatal(err)
}
fmt.Println(name)
Query()
복수의 Row를 return 하는 경우, 즉 결과 값이 하나 이상일 때
복수의 Row를 리턴하는 경우, Row에서 데이터를 읽고 다음 Row로 이동하기 위해 Next() 메서드를 사용
실제 데이터를 로컬 변수(String)에 할당
var name string
rows, err := db.Query("SELECT title FROM foodie LIMIT ?", 5)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&name)
if err != nil {
log.Fatal(err)
}
fmt.Println("rows", name)
}