Programming Language/Go

[Go+MySQL] Go에서 MySQL 사용하기

new_challenge 2020. 10. 20. 23:50
반응형

이번 포스팅은 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

 

[Golang] MySQL-Driver GitHub 번역 및 사용

이번 포스팅은 Go에서 MySQL DB 연결 시 사용하는 MySQL-Driver의 github 내용을 번역한 포스팅입니다. MySQL-Driver 깃허브 github.com/go-sql-driver/mysql go-sql-driver/mysql Go MySQL Driver is a MySQL dr..

soyoung-new-challenge.tistory.com

 

> 필요한 패키지 다운로드

$ 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)
}

 

반응형