Goの環境構築ができたので、軽量DBとしてSQLite3を使ってみようと思った。
GoもMacも初心者である。
環境
- MacBook Air (M1, 2020)
- macOS Big Sur 11.3.1
- SQLite3 3.32.3
- Go 1.16.5
- SQLite3 Driver github.com/mattn/go-sqlite3 v1.14.7
予備知識
GOでSQLite3を扱うためには、Driverと呼ばれるライブラリが必要らしい。
こちらのサイトを見ると、database/sqlインターフェースをサポートしているmattn/go-sqlite3というものが良さそうなので、これを使用する方針とした。
ググったらmattn/go-sqlite3を使う方法はたくさん出てきたが、そこに書かれた手順通りにやっても、"go install: package github.com/mattn/go-sqlite3 is not a main package"というようなエラーになってうまくいかなかった。
これはmattn/go-sqlite3の問題ではなく、Go 1.16ではデフォルトとなったらしい「モジュール対応モード(module-aware mode)」に適した方法でモジュールをインストールしないといけなかったためだった。
Go初心者に対するハメ技的な事象だったので、手順をメモに残す。
SQLite3のインストール
MacにはSQLite3が標準でインストールされているらしい。
% sqlite3 -vesrion
3.32.3 2020-06-18 14:16:19 02c344aceaea0d177dd42e62c8541e3cab4a26c757ba33b3a31a43ccc7d4aapl
brew install sqlite3 を実行した気もするが、気のせいか。
go-sqlite3はCGOパッケージというものらしい。go-sqlite3を使ったGoアプリをビルドするときには、GCCが必要だとのこと。
Macの場合は、Xcodeをインストールした後、下記コマンドでgccがインストールされるらしい。
xcode-select --install
本題
本家のドキュメントでも、"go getすればパッケージがインストールされる"と書いてある気がするが、Go 1.16(というかmodule-aware modeの場合)だと、もう少し手順が必要。
まず、適当なフォルダを作成(sqlite3-testとする)し、そのフォルダ内にメインのソースコード(main.goとする)を作成する。
package main
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
func main() {
hogehoge
}
sqlite3-testフォルダで、go mod initを実行する。
すると、go.modファイルが生成される。
% go mod init sqlite-test
% cat go.mod
module sqlite-test
go 1.16
この状態でgo getを行うと、matt/go-sqlite3パッケージがインストールされる。
% go get github.com/mattn/go-sqlite3
go: downloading github.com/mattn/go-sqlite3 v1.14.7
go get: added github.com/mattn/go-sqlite3 v1.14.7
% cat go.mod
module sqlite-test
go 1.16
require github.com/mattn/go-sqlite3 v1.14.7 // indirect
あとは、go runで実行すれば良い。
% go run main.go
感想
最初はエラーの意味が分からず、パッケージ側の問題かと思っていたが、Goのモジュール管理の方法が変わったことによる手順の違いだった。
(もしかしたら、Go熟練者にとってはgo.modが必要なことは常識過ぎて、記事に書いてなかっただけかもしれない。)
新しい環境になれるのには、なにかと時間がかかる。