メインコンテンツまでスキップ

DBとの接続

GoでDBと接続を行うには、ドライバーを入れる必要があります
ドライバーの一覧は 公式のWikiに記載されています

今回は、mattn/go-sqlite3を使用します

初期設定

標準ではないパッケージを使用するため、モジュールの依存関係を管理するファイルである go.mod を作成します
作成するには go mod initコマンドを使用します
(sqlite-exampleの部分はモジュール名なのでお好みで変えてもらっても大丈夫です)

go mod init sqlite-example

そして、go getコマンドによってインストールします
(これを実行するとgo.modに記述されるので見てみてください)

go get github.com/mattn/go-sqlite3

今回は、ex2.dbを使用します
以下の手順でデータを入れておきます
(Go側からデータを入れることもできますが、簡単のため先にデータを用意しておきます)

# ex2.dbという名前のDB(ファイル)を作成
$ sqlite3 ex2.db

# 初期化を行う
sqlite> DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS contents;

-- usersテーブルを作成
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(50) NOT NULL UNIQUE
);

-- usersテーブルにデータを挿入
INSERT INTO users (id, name)
VALUES
(1, 'matumoto'),
(2, 'eraser'),
(3, 'suzakutakumi'),
(4, 'yuorei');

-- contentsテーブルを作成
CREATE TABLE contents(
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
content VARCHAR(140) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);

-- contentsテーブルにデータを挿入
INSERT INTO contents (user_id, content)
VALUES
(1, 'おなかいて'),
(1, '二度寝してた'),
(1, '家 集中力 どうして[検索]'),
(2, '雨ワロタ'),
(2, 'とりっくおあとりーと'),
(3, '手足が軽く震えてる'),
(4, '山手線一周した'),
(1, 'ぐわーーーっっっ!!!(断末魔)');


# SELECTの際にヘッダーを表示するように設定を変更
sqlite> .headers on

# テーブル名を表示
sqlite> .table

DBのテーブルの中身を取得してみる

次にGoの中でusersテーブルの中身を取得するようなコードを書いてみます
(簡単のためにエラーハンドリングなしで書いています)

package main

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

_ "github.com/mattn/go-sqlite3"
)

func main() {
db, _ := sql.Open("sqlite3", "./ex2.db")
defer db.Close()

rows, _ := db.Query("SELECT * FROM users")
defer rows.Close()

for rows.Next() {
var id int
var name string
rows.Scan(&id, &name)
fmt.Println(id, name)
}
}
エラーハンドリングありver
package main

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

_ "github.com/mattn/go-sqlite3"
)

func main() {
db, err := sql.Open("sqlite3", "./ex2.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()

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

for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
}