標準ライブラリでデータベースに接続
データベース(今回は MariaDB)に接続します。
事前準備
MariaDB 向けの Go ドライバをインストールします:
go get -u github.com/go-sql-driver/mysql
下記 DDL でデータベースを用意しておきます:
-- データベース作成
CREATE DATABASE snaildb;
USE snaildb;
-- テーブル作成
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT
, name VARCHAR(20) NOT NULL
, age INT NOT NULL
);
サンプルコード
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// DB接続
db, err := connectDB()
if err != nil {
log.Fatal("DB access failed")
}
// ユーザ登録実行
insert(db, users{name: "nob", age: 13})
// 複数ユーザ検索実行
fmt.Println(findByAge(db))
// 単一ユーザ検索実行
fmt.Println(findById(db))
}
// データベースに接続します。
func connectDB() (*sql.DB, error) {
// ユーザー名:パスワード@tcp(ホスト:ポート)/データベース名
dsn := "root:password@tcp(localhost:3306)/snaildb"
db, err := sql.Open("mysql", dsn)
if err != nil {
return nil, err
}
// 実際に接続できるかを確認
err = db.Ping()
if err != nil {
return nil, err
}
return db, nil
}
// ユーザを登録します。
func insert(db *sql.DB, u users) {
// クエリ実行
_, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", u.name, u.age)
if err != nil {
log.Fatal(err)
}
}
// 30歳未満のユーザ(複数)を検索します。
func findByAge(db *sql.DB) []users {
rows, err := db.Query("SELECT * FROM users WHERE age < ?", 30) // 30歳未満を抽出
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var usersList []users
for rows.Next() {
var id int
var name string
var age int
if err := rows.Scan(&id, &name, &age); err != nil {
log.Fatal(err)
}
u := users{id: id, name: name, age: age}
usersList = append(usersList, u)
}
return usersList
}
// ID=1のユーザ(単一)を検索します。
func findById(db *sql.DB) users {
row := db.QueryRow("SELECT * FROM users WHERE id = ?", 1) // ID=1を抽出
var id int
var name string
var age int
row.Scan(&id, &name, &age)
return users{id, name, age}
}
// usersテーブル向けのモデルです。
type users struct {
id int // ID
name string // 名前
age int // 年齢
}