12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoでMySQL接続するメモ

Last updated at Posted at 2018-11-12

これはなに

Go言語でMySQLに接続する場合に筆者が設定している項目です。

前提

動作確認はしていないですが、JSON型を採用したいのでMySQL 5.7以降の話です。
InnoDBです。MyISAMなんて知りません。

利用ライブラリ

StructとDBのつなぎにはsqlxを採用します。

import (
        "database/sql"
        _ "github.com/go-sql-driver/mysql" // Using MySQL driver
        "github.com/jmoiron/sqlx"
)

接続部分

// NewMySQL is create connection to MySQL using sqlx
func NewMySQL(dsn string) (*sqlx.DB, error) {
        DB, err := sqlx.Open("mysql", dsn)

        if err != nil {
                return nil, err
        }
        err = DB.Ping()
        if err != nil {
                return nil, err
        }

        return DB, nil
}

DSN

DSN (Data Source Name)の仕様

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

オプションパラメータについて

DB NAMEのあとにクエリストリングらしきものを書くとDB接続オプションになるので、MySQLの接続オプションを利用できる。

  • parseTime=true
    • sqlxを使っていて、bindする先のStructでtime.Timeを受け取れるようになる便利
  • autocommit=0
    • rollback忘れとかこわいので、、
  • sql_mode=%27TRADITIONAL,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY%27
  • read_only=ON
    • リード用DBとかを用意するけど開発環境で2つDBを用意するのが面倒なのでオプションでRead_onlyにすることがある

DSN環境変数スニペット

export MYSQL_HOST="127.0.0.1"
export MYSQL_TCP_PORT="3306"
export MYSQL_PWD=""
export MYSQL_USER="root"
export DB_NAME="hogedb"
export DSN="${MYSQL_USER}:${MYSQL_PWD}@tcp(${MYSQL_HOST}:${MYSQL_TCP_PORT})/${DB_NAME}?parseTime=true&autocommit=0&sql_mode=%27TRADITIONAL,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY%27"
12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?