データベースにクエリを投げて結果をプリントするライブラリqpを作った

データベースを伴うテストを書いていて、何故かテスト結果が安定しない事象に出くわして「なんでだ?????」と混乱した結果、データベースの状況をprintデバッグをしたくなって作りました*1

github.com

使い方は

package main

import (
    "database/sql"
    "log"

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

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

    qp.Print(db, "SELECT * FROM users WHERE username = 'alice'")
}

みたいにqp.Print()*sql.DB と実行したいクエリを渡すと、

$ go run main.go
+----+----------+----------+-------------------+---------------------+---------+
| id | username | password |       email       |       created       | updated |
+----+----------+----------+-------------------+---------------------+---------+
|  1 | alice    | passw0rd | alice@example.com | 2017-12-05 00:00:00 | <nil>   |
+----+----------+----------+-------------------+---------------------+---------+
(1 row)

のように結果がでるシンプルなものです。SELECT だけ結果をだしますが、他のクエリでもデータベースに投げるようにしています。

私のように混乱しないとなかなか必要になることはないと思いますが、「Goのコードからデータベースにクエリをカジュアルに投げてデバッグしたい」というときがあれば使ってみてください。

*1:原因は、単純にgo test ./... がパッケージ単位で並列に実行されるのに対して別のパッケージで同じテストデータベースにクエリを投げていたからでした...