追記いただいたコード(InsertHoge メソッド)をベースに全体的に書き換えました。ローカルで試す際は Docker などを用いて PostgreSQL に接続できる環境でお試しください。
LastInsertId
は PostgreSQL のドライバーでは使えない (参照: no LastInsertId available in Postgresql) ため RETURNING
句を用いるのはどうでしょうか?RETURNING
は squirrel
のクエリビルダで付与するイメージです。
コード
go
1package main
2
3import (
4 "database/sql"
5 "fmt"
6
7 "github.com/jmoiron/sqlx"
8 _ "github.com/lib/pq"
9
10 sq "github.com/Masterminds/squirrel"
11)
12
13func (p *Postgres) InsertHoge(hoge *Hoge) (*Hoge, error) {
14 query, args, err := sq.StatementBuilder.PlaceholderFormat(sq.Dollar).
15 Insert("hoge").Columns("title").Values(hoge.Title).Suffix("RETURNING *").ToSql()
16
17 if err != nil {
18 return nil, err
19 }
20
21 tx, err := p.Beginx()
22 if err != nil {
23 return nil, err
24 }
25
26 var h Hoge
27 if err := tx.QueryRowx(query, args[0]).StructScan(&h); err != nil {
28 return nil, err
29 }
30
31 tx.Commit()
32
33 // エラーのときのロールバックの処理は割愛
34 return &h, nil
35}
36
37// ------------------------------------------------------------------------------------------------
38// ローカルの Docker の起動
39// $ docker run --name tmp-postgres -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres
40// ------------------------------------------------------------------------------------------------
41
42func main() {
43 // Docker上のデータベースへの接続
44 db, err := sql.Open("postgres", fmt.Sprintf(
45 "user=%s password=%s host=%s port=%s dbname=%s sslmode=%s",
46 "postgres", "postgres", "localhost", "5432", "postgres", "disable",
47 ))
48 if err != nil {
49 panic(err)
50 }
51
52 // sqlxライブラリの使用
53 x := sqlx.NewDb(db, "postgres")
54
55 // Postgres構造体の値生成
56 p := &Postgres{x}
57
58 // クエリの実行
59 m, err := p.InsertHoge(&Hoge{Title: "gopher"})
60 if err != nil {
61 panic(err)
62 }
63
64 // 結果の表示
65 fmt.Printf("%+v\n", m)
66}
67
68/*
69-- DDLは以下のようなものを想定
70
71CREATE TABLE hoge (
72 id SERIAL NOT NULL,
73 title VARCHAR(255) NOT NULL,
74 PRIMARY KEY (id)
75);
76*/
77type Hoge struct {
78 Id int `db:"id"`
79 Title string `db:"title"`
80}
81
82type Postgres struct{ *sqlx.DB }
取得できる結果例
以下のように ID と Title の組み合わせでオートインクリメントされた ID の値も取得できます。