write ahead log

ロールフォワード用

golangでWindows10上でSQLite3を使う

golangでSQLite3を使う情報は多いのだけれど,
Windowsで使うとなると一気に情報が減ってしまう.

事前準備

ちょっと面倒ですが,まずはgccが必要です.
以下からダウンロードします.

tdm-gcc

msys2なんかでよく使うMinGWではダメっぽいです.
(msys2使ってるので良い方法があるなら知りたいです)

ライブラリ作者のmattnさんもgolangのビルドにはmsys2使ってないっぽいですね.
github - issues -

そういうわけでcmd.exeでgo getします.

C:\Users\Twinbird>go get github.com/mattn/go-sqlite3

これで準備はOKです.

サンプルコード

見た方が早いですね.

package main

import (
    "os"
    "database/sql"
    _ "github.com/mattn/go-sqlite3"
)

func main() {
    dbfile := "./test.db"

    os.Remove(dbfile)

    db, err := sql.Open("sqlite3", dbfile)
    if err != nil { panic(err) }

    // 単発で実行
    _, err = db.Exec(`CREATE TABLE "messages" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "msg" VARCHAR(255))`)
    if err != nil { panic(err) }

    // 単発で実行
    _, err = db.Exec(`
      INSERT INTO "messages" ("msg") VALUES(?)`,
        "こんにちは",
    )
    if err != nil { panic(err) }

    // プリペアステートメント
    stmt, err := db.Prepare(`INSERT INTO "messages" ("msg") VALUES(?)`)
    if err != nil { panic(err) }

    if _, err = stmt.Exec("世界"); err != nil { panic(err) }
    if _, err = stmt.Exec("Hello"); err != nil { panic(err) }
    if _, err = stmt.Exec("World"); err != nil { panic(err) }

    stmt.Close()

    db.Close()
}

ビルド

これもcmd.exeでやりましょう.

C:\Users\Twinbird\samples>go build

実行と確認

実行はmsys2環境でもできます.

SQLiteで確認してみましょう.

SQLite version 3.10.0 2016-01-06 11:01:07
Enter ".help" for usage hints.
sqlite> .tables
messages
sqlite> select * from messages;
1|こんにちは
2|世界
3|Hello
4|World

うまくいきました.