以下の内容はhttps://devlights.hatenablog.com/entry/2026/03/18/073000より取得しました。


Goメモ-668 (fergusstrange/embedded-postgres)(埋め込みPostgreSQL)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ · GitHub

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

以下のライブラリを知りました。埋め込みのPostgreSQLってあるんですねー。便利。

github.com

最近は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のおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。




以上の内容はhttps://devlights.hatenablog.com/entry/2026/03/18/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14