LoginSignup
41
28

More than 5 years have passed since last update.

Go言語でMySQL の基本的操作(SELECT、UPDATE、INSERT)を行う

Posted at

実行環境

環境は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

41
28
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
41
28