関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ · GitHub
概要
以下、自分用のメモです。忘れないうちにメモメモ。。。
以下のライブラリを知りました。埋め込みのPostgreSQLってあるんですねー。便利。
最近はDockerとかもあるので、大して苦労しないですが、やっぱり埋め込みで動作するって便利です。
以下、自分用に使い方とかのメモです。
試してみた
インストール
$ go get github.com/fergusstrange/embedded-postgres@latest $ go get github.com/lib/pq
main.go
package main import ( "database/sql" "io" "log" "os" "os/signal" "syscall" "time" _ "embed" embedpsql "github.com/fergusstrange/embedded-postgres" _ "github.com/lib/pq" ) const ( dsn = "host=localhost port=5432 user=postgres password=postgres dbname=postgres sslmode=disable" ) var ( //go:embed northwind.sql northwindSQL string // ビルド時にSQLファイルを埋め込む ) func init() { log.SetFlags(log.Ltime | log.Lmicroseconds) } func main() { // // fergusstrange/embedded-postgres は、PostgreSQLを埋め込みで利用できるようにしてくれるライブラリ。 // テスト用のデータベースで確認したい場合などにとても便利。 // // データベースは起動する度にまっさらな状態で起動する。 // // ダウンロードされた PostgreSQL は ~/.embedded-postgres-go に配置される。 // log.Println("=> START") defer func() { log.Println("=> END") }() if err := run(); err != nil { panic(err) } } func run() error { // // embedded postgres の設定と起動 // // ログバッファ var ( logBuf = io.Discard ) if os.Getenv("PG_DEBUG") != "" { logBuf = os.Stdout } // 設定 var ( conf embedpsql.Config ) conf = embedpsql.DefaultConfig(). Username("postgres"). Password("postgres"). Database("postgres"). Port(5432). Version(embedpsql.V18). StartTimeout(30 * time.Second). Logger(logBuf) // データベース起動 var ( pg = embedpsql.NewDatabase(conf) ) if err := pg.Start(); err != nil { return err } // シグナルハンドリング var ( sigCh = make(chan os.Signal, 1) ) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) go func() { <-sigCh log.Println("\n==> Shutting down...") if err := pg.Stop(); err != nil { log.Printf("pg.Stop error: %v", err) } os.Exit(0) }() defer func() { if err := pg.Stop(); err != nil { log.Printf("==> pg.Stop error: %v", err) } log.Println("==> embedded-postgres stopped") }() log.Println("==> embedded-postgres started") // // database/sql で接続 // var ( db *sql.DB err error ) db, err = sql.Open("postgres", dsn) if err != nil { return err } defer db.Close() if err := db.Ping(); err != nil { return err } log.Println("==> ping OK") // // スキーマとデータ投入 // if _, err = db.Exec(northwindSQL); err != nil { return err } // // クエリ発行 // const ( query = ` SELECT ship_country, COUNT(*) AS order_count FROM orders GROUP BY ship_country ORDER BY order_count DESC LIMIT 10 ` ) var ( rows *sql.Rows ) if rows, err = db.Query(query); err != nil { return err } defer rows.Close() var ( country string count int ) for rows.Next() { rows.Scan(&country, &count) log.Printf("%-20s %d", country, count) } return nil }
Taskfile.yml
# yaml-language-server: $schema=https://taskfile.dev/schema.json version: '3' vars: NORTHWIND_URL: https://raw.githubusercontent.com/pthom/northwind_psql/master/northwind.sql tasks: default: cmds: - task: run download-northwind: cmds: - wget {{.NORTHWIND_URL}} build: cmds: - go build -o app main.go run: deps: - build cmds: - ./app
実行結果
$ task task: [build] go build -o app main.go task: [run] ./app 20:37:48.401351 => START 20:37:50.358560 ==> embedded-postgres started 20:37:50.362736 ==> ping OK 20:37:50.440421 Germany 122 20:37:50.440451 USA 122 20:37:50.440453 Brazil 83 20:37:50.440455 France 77 20:37:50.440456 UK 56 20:37:50.440457 Venezuela 46 20:37:50.440458 Austria 40 20:37:50.440459 Sweden 37 20:37:50.440460 Canada 30 20:37:50.440461 Italy 28 20:37:50.541883 ==> embedded-postgres stopped 20:37:50.541911 => END
参考情報
個人的Goのおすすめ書籍
個人的に読んでとても勉強になった書籍さんたちです。
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。