MySQLのINSERTを実行する

ツイート このエントリーをはてなブックマークに追加
1つ上へ / ブログトップへ

SELECTの方法が分かればINSERTは実行するメソッドが違うだけです(なので説明は一部省略します)。

package main

import (
        "database/sql"
        "fmt"
        "github.com/go-sql-driver/mysql"
)

func main() {
        db, err := sql.Open("mysql", "gotest:gotest@/demo")
        if err != nil {
                fmt.Printf("Failed to connect")
                return
        }
        defer db.Close()

        statement, err := db.Prepare("INSERT INTO user(id,email) VALUES(?,?)")
        if err != nil {
                fmt.Printf("Failed to prepare : %s", err)
                return
        }
        defer statement.Close()

        _, err = statement.Exec("123", "demo@fkmsoft.jp")
        if err != nil {
                if err2, ok := err.(*mysql.MySQLError); ok {
                        fmt.Printf("Failed to execute Query : %s Number=%d", er\
r, err2.Number)
                } else {
                        fmt.Printf("Failed to execute Query : %s", err, err)
                }
                return
        }
        fmt.Printf("created!\n")
}

SELECTの時と違う部分だけ説明します。

statement, err := db.Prepare("INSERT INTO user(id,email) VALUES(?,?)")
if err != nil {
        fmt.Printf("Failed to prepare : %s", err)
        return
}
defer statement.Close()

パラメータがある場合は?を使います。

_, err = statement.Exec("123", "demo@fkmsoft.jp")
if err != nil {
        if err2, ok := err.(*mysql.MySQLError); ok {
                fmt.Printf("Failed to execute Query : %s Number=%d", err, err2.Number)
        } else {
                fmt.Printf("Failed to execute Query : %s", err, err)
        }
        return
}

更新系はQuery()メソッドではなく、Exec()メソッドを使用します。Stmtオブジェクトを作る時に?を2つ指定しているので、ここでは引数を2つ指定しています。

更新系の場合、「一意制約でひっかかったら更新する」といった処理をやりたい時があるので、エラーをチェックしたいことがあります。errの型がmysql.Errorの時は、Numberフィールドの値にMySQLのエラーコードが入っています。例えばDuplicate Entryだと1062が入っています。

1つ上へ / ブログトップへ