これはなに
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
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
オプションパラメータについて
DB NAMEのあとにクエリストリングらしきものを書くとDB接続オプションになるので、MySQLの接続オプションを利用できる。
-
parseTime=true
- sqlxを使っていて、bindする先のStructで
time.Time
を受け取れるようになる便利
- sqlxを使っていて、bindする先のStructで
-
autocommit=0
- rollback忘れとかこわいので、、
-
sql_mode=%27TRADITIONAL,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY%27
-
%27
はダブルクオートのエスケープ - kamipo TRADITIONAL
-
-
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"