#実行環境
環境はMacにインストールされたGo1.11.2、MySQLは8.0.15です。
####MySQLコネクション
sqlパッケージのOpen関数に、ユーザ名:パスワード@IPアドレス/データベース名の順で記述する。Open関数の戻り値はsql.DB。また、sqlパッケージとmysqlドライバーパッケージをインポートする。
package main
import (
"fmt"
"log"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "forge:forge@tcp(127.0.0.1:3333)/webapp")
if err != nil{
log.Fatal("db error.")
}
defer db.Close()
}
####SELECT
db.Query()にでSELECT文を渡す。rowsに結果セットが格納されるため、rows.Next()で一行一行処理を行う。Scan()に変数ポインタを渡し、DBの結果をセットする。また、引数にはSELECTしたカラム数分指定する必要があるので少し注意が必要。User構造体の変数に結果をセットしている。
rows, err := db.Query("select id,code,email,name,password from tbl_users")
if err != nil {
log.Fatal(err)
}
var userResult []User
for rows.Next() {
user := User{}
if err := rows.Scan(&user.id,&user.code,&user.email,&user.name,&user.password); err != nil {
log.Fatal(err)
}
userResult = append(userResult,user)
}
for _,u := range userResult{
fmt.Println("code: ", u.code,", email: ", u.email,
", name: ", u.name,", password: ",u.password)
}
####INSERT
Prepare()にINSERT文を渡して、Exec()にプリペアードステートメントを指定してSQLを実行する。
// insert
ins, err := db.Prepare("INSERT INTO tbl_users(code,email,name,password) VALUES(?,?,?,?)")
if err != nil {
log.Fatal(err)
}
ins.Exec("golang-2019", "golang+001@gmail.com","Jhon","123456")
####UPDATE
ほぼ、INSERTと同様。Prepare()に文を渡して、Exec()にプリペアードステートメントを指定してSQLを実行する。
//update
upd, err := db.Prepare("UPDATE tbl_users set password = ? where name = ? ")
if err != nil {
log.Fatal(err)
}
upd.Exec("67890", "Jhon")
#雑感
DB操作は他の言語とほぼ変わらなく問題なく利用出来そう。SELECTの場合は、構造体(エンティティ)に値をセット、リポジトリクラス(UserRepository)やDBアクセス用のファサードを用意すると良さそう。
###参考
http://www.golangprograms.com/example-of-golang-crud-using-mysql-from-scratch.html
https://teratail.com/questions/110152
https://www.pospome.work/entry/2017/02/18/172307
https://github.com/golang/go/blob/master/src/database/sql/example_test.go