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が入っています。