You are currently viewing Go言語でCRUDしてみる

Go言語でCRUDしてみる

Go言語の勉強をちょこちょこ始めています。
まずはDB操作をということで、CRUDを試して見ました

いきなりソースコード

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	dbconf := "root:password@tcp(127.0.0.1:3306)/practice?charset=utf8mb4"

	db, err := sql.Open("mysql", dbconf)
	if err != nil {
		fmt.Println(err.Error())
	}
	defer db.Close()

	err = db.Ping()

	if err != nil {
		fmt.Println("データベース接続失敗")
		return
	} else {
		fmt.Println("データベース接続成功")
	}

	// INSERT
	fmt.Println("Insert")
	sqlInsert(db)

	// UPDATE
	fmt.Println("Update")
	sqlUpdate(db)

	// DELETE
	fmt.Println("Delete")
	sqlDelete(db)

	// SELECT
	fmt.Println("Select")
	sqlSelect(db)
}

// Insert
func sqlInsert(db *sql.DB) {
	ins, err := db.Prepare("INSERT INTO test VALUES (null, ?)")
	if err != nil {
		log.Fatal(err)
	}

	res, err := ins.Exec("messsage 1")
	if err != nil {
		log.Fatal(err)
	}

	lastInsertId, err := res.LastInsertId()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(lastInsertId)

	res, err = ins.Exec("messsage 2")
	if err != nil {
		log.Fatal(err)
	}
	lastInsertId, err = res.LastInsertId()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(lastInsertId)

	res, err = ins.Exec("messsage 3")
	if err != nil {
		log.Fatal(err)
	}
	lastInsertId, err = res.LastInsertId()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(lastInsertId)
}

// UPDATE
func sqlUpdate(db *sql.DB) {
	upd, err := db.Prepare("UPDATE test SET message = ? WHERE id = 1")
	if err != nil {
		log.Fatal(err)
	}
	res, err := upd.Exec("updated message")
	if err != nil {
		log.Fatal(err)
	}

	lastInsertId, err := res.LastInsertId()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(lastInsertId)
}

// DELETE
func sqlDelete(db *sql.DB) {
	upd, err := db.Prepare("DELETE FROM test WHERE id = ?")
	if err != nil {
		log.Fatal(err)
	}
	res, err := upd.Exec(2)
	if err != nil {
		log.Fatal(err)
	}

	lastInsertId, err := res.LastInsertId()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(lastInsertId)
}

// SELECT
func sqlSelect(db *sql.DB) {

	rows, err := db.Query("SELECT id, message FROM test")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var (
			id      int
			message string
		)

		err := rows.Scan(&id, &message)
		if err != nil {
			panic(err.Error())
		}
		fmt.Println("id=", id, "message=", message)
	}
}

上記の実行結果がこちら

一回動作確認しちゃったので、IDは3から始まっています。
DELETE文の引数でID=2を指定しているので、DELETEは空振りしていますね・・・

VSCodeの出力結果はこんな感じで、それぞれ処理が行われていることがわかります。

以上

短いですが、以上です。
ORマッパーも利用していないため、かなりシンプルに書くことができました。
Goのdeferを利用することでDBの閉じ忘れも防止できそうです。

created by Rinker
¥3,278 (2024/04/07 23:28:55時点 楽天市場調べ-詳細)

コメントを残す