본문 바로가기

개발

Golang - Connect to MySQL

1. MySQL 생성

MySQL에 접속하기 이전에 접속할 MySQL을 생성합니다.
Local에 MySQL을 다운로드 받거나 AWS에서 MySQL을 생성하는 등 각자의 방식으로 접속할 MySQL을 생성합니다.

2. MySQL Table 생성

MySQL 접속

mysql -u username -h hostname -P 3306 -p
Enter password:

사용할 데이터베이스로 변경

mysql> USE {databasename}

테이블 생성 및 테스트 데이터 INSERT

DROP TABLE IF EXISTS album;
CREATE TABLE album (
  id         INT AUTO_INCREMENT NOT NULL,
  title      VARCHAR(128) NOT NULL,
  artist     VARCHAR(255) NOT NULL,
  price      DECIMAL(5,2) NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO album
  (title, artist, price)
VALUES
  ('Blue Train', 'John Coltrane', 56.99),
  ('Giant Steps', 'John Coltrane', 63.99),
  ('Jeru', 'Gerry Mulligan', 17.99),
  ('Sarah Vaughan', 'Sarah Vaughan', 34.98);

결과

mysql> DROP TABLE IF EXISTS album;
Query OK, 0 rows affected, 1 warning (0.07 sec)

mysql> CREATE TABLE album (
    ->   id         INT AUTO_INCREMENT NOT NULL,
    ->   title      VARCHAR(128) NOT NULL,
    ->   artist     VARCHAR(255) NOT NULL,
    ->   price      DECIMAL(5,2) NOT NULL,
    ->   PRIMARY KEY (`id`)
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql>
mysql> INSERT INTO album
    ->   (title, artist, price)
    -> VALUES
    ->   ('Blue Train', 'John Coltrane', 56.99),
    ->   ('Giant Steps', 'John Coltrane', 63.99),
    ->   ('Jeru', 'Gerry Mulligan', 17.99),
    ->   ('Sarah Vaughan', 'Sarah Vaughan', 34.98);
Query OK, 4 rows affected (0.08 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from album;
+----+---------------+----------------+-------+
| id | title         | artist         | price |
+----+---------------+----------------+-------+
|  1 | Blue Train    | John Coltrane  | 56.99 |
|  2 | Giant Steps   | John Coltrane  | 63.99 |
|  3 | Jeru          | Gerry Mulligan | 17.99 |
|  4 | Sarah Vaughan | Sarah Vaughan  | 34.98 |
+----+---------------+----------------+-------+
4 rows in set (0.07 sec)

3. Golang Driver를 통한 연결 확인

환경변수에 데이터베이스에 연결하기 위한 정보들을 등록해줍니다.

export DBUSER={dbuser}
export DBPASS={dbpass}
export DBHOST={hostname}
export DBNAME={databasename}                                                       

다음과 같이 코드를 작성하여 MySQL에 연결이 가능한지 확인합니다.

  • main.go
package main

import (  
"database/sql"  
"fmt"  
"log"  
"os"

"github.com/go-sql-driver/mysql"
)

var db \*sql.DB

func main() {
cfg := mysql.Config{
    User:                 os.Getenv("DBUSER"),
    Passwd:               os.Getenv("DBPASS"),
    Net:                  "tcp",
    Addr:                 os.Getenv("DBHOST"),
    DBName:               os.Getenv("DBNAME"),
    AllowNativePasswords: true,
}

var err error
db, err = sql.Open("mysql", cfg.FormatDSN())
if err != nil {
    log.Fatal(err)
}

pingErr := db.Ping()
if pingErr != nil {
    log.Fatal(pingErr)
}

fmt.Println("Connected!")
}

go get . 을 통해 실행에 필요한 go package를 다운로드 받습니다.


go get .  
go: downloading github.com/go-sql-driver/mysql v1.8.1  
go: downloading filippo.io/edwards25519 v1.1.0  
go: added filippo.io/edwards25519 v1.1.0  
go: added github.com/go-sql-driver/mysql v1.8.1

실행하면 다음과 같이 노출됩니다.

go run main.go
Connected!

4. SELECT 쿼리 실행

SQL 쿼리를 통해 Album 테이블에서 데이터를 가져오는 함수를 작성합니다.

func albumsByArtist(name string) ([]Album, error) {
    var albums []Album

    rows, err := db.Query("SELECT * FROM album WHERE artist = ?", name)
    if err != nil {
        return nil, fmt.Errorf("albumsByArtist %q: %v", name, err)
    }
    defer rows.Close()

    for rows.Next() {
        var alb Album
        if err := rows.Scan(&alb.ID, &alb.Title, &alb.Artist, &alb.Price); err != nil {
            return nil, fmt.Errorf("albumsByArtist %q: %v", name, err)
        }
        albums = append(albums, alb)
    }

    if err := rows.Err(); err != nil {
        return nil, fmt.Errorf("albumsByArtist %q: %v", name, err)
    }

    return albums, nil
}

main 함수에서 albumsByArtist 함수를 호출합니다.

    albums, err := albumsByArtist("John Coltrane")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Albums found: %v\n", albums)

전체 코드는 다음과 같습니다.

package main

import (
    "database/sql"
    "fmt"
    "log"
    "os"

    "github.com/go-sql-driver/mysql"
)

var db *sql.DB

type Album struct {
    ID     int64
    Title  string
    Artist string
    Price  float32
}

func albumsByArtist(name string) ([]Album, error) {
    var albums []Album

    rows, err := db.Query("SELECT * FROM album WHERE artist = ?", name)
    if err != nil {
        return nil, fmt.Errorf("albumsByArtist %q: %v", name, err)
    }
    defer rows.Close()

    for rows.Next() {
        var alb Album
        if err := rows.Scan(&alb.ID, &alb.Title, &alb.Artist, &alb.Price); err != nil {
            return nil, fmt.Errorf("albumsByArtist %q: %v", name, err)
        }
        albums = append(albums, alb)
    }

    if err := rows.Err(); err != nil {
        return nil, fmt.Errorf("albumsByArtist %q: %v", name, err)
    }

    return albums, nil
}

func main() {
    cfg := mysql.Config{
        User:                 os.Getenv("DBUSER"),
        Passwd:               os.Getenv("DBPASS"),
        Net:                  "tcp",
        Addr:                 os.Getenv("DBHOST"),
        DBName:               os.Getenv("DBNAME"),
        AllowNativePasswords: true,
    }

    var err error
    db, err = sql.Open("mysql", cfg.FormatDSN())
    if err != nil {
        log.Fatal(err)
    }

    pingErr := db.Ping()
    if pingErr != nil {
        log.Fatal(pingErr)
    }

    fmt.Println("Connected!")

    albums, err := albumsByArtist("John Coltrane")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Albums found: %v\n", albums)
}

실행하면 다음과 같이 노출됩니다.

go run main.go
Connected!
Albums found: [{1 Blue Train John Coltrane 56.99} {2 Giant Steps John Coltrane 63.99}]

'개발' 카테고리의 다른 글

Golang - echo를 활용한 API Server 만들기  (0) 2024.09.21
Golang - Connect to MongoDB  (2) 2024.09.18
Golang - 프로젝트 시작  (0) 2024.09.18
Q Learning과 DQN  (0) 2023.12.09
nestjs 앱 docker로 배포하기  (0) 2023.12.07