Оказывается, есть gopkg.in/mgutz/dat.v2
(не v1
), который работает. Вот модифицированный скрипт:
package main
import (
"database/sql"
"fmt"
"time"
_ "github.com/lib/pq"
"gopkg.in/mgutz/dat.v2/dat"
runner "gopkg.in/mgutz/dat.v2/sqlx-runner"
)
// global database (pooling provided by SQL driver)
var DB *runner.DB
func init() {
// create a normal database connection through database/sql
db, err := sql.Open("postgres", "dbname=postgres user=postgres password=mypassword host=localhost sslmode=disable")
if err != nil {
panic(err)
}
// ensures the database can be pinged with an exponential backoff (15 min)
runner.MustPing(db)
// set to reasonable values for production
db.SetMaxIdleConns(4)
db.SetMaxOpenConns(16)
// set this to enable interpolation
dat.EnableInterpolation = true
// set to check things like sessions closing.
// Should be disabled in production/release builds.
dat.Strict = false
// Log any query over 10ms as warnings. (optional)
runner.LogQueriesThreshold = 10 * time.Millisecond
DB = runner.NewDB(db, "postgres")
}
type Post struct {
ID int64 `db:"id"`
Title string `db:"title"`
Body string `db:"body"`
UserID int64 `db:"user_id"`
State string `db:"state"`
UpdatedAt dat.NullTime `db:"updated_at"`
CreatedAt dat.NullTime `db:"created_at"`
}
func main() {
var post Post
if err := DB.
Select("id, title").
From("posts").
Where("id = $1", 13).
QueryStruct(&post); err != nil {
panic(err)
}
fmt.Println("Title", post.Title)
}
Чтобы запустить скрипт, я запустил контейнер Docker примерно так:
docker run --name mypostgres -p "5432:5432" -e POSTGRES_PASSWORD=mypassword -d postgres
, подключенный к нему с помощью
psql --host=localhost --port=5432 --username=postgres --dbname=postgres
и ввел ожидаемую таблицу и строку:
postgres=# create table posts (id int, title varchar(50), body varchar(50), user_id int, state varchar(50), updated_at time, created_at time);
CREATE TABLE
postgres=# insert into posts (id, title, body, user_id, state, updated_at, created_at) values (13, 'My first post', 'Hello, world!', 1, 'CA', now(), now());
INSERT 0 1
Который печатает ожидаемый результат:
> go run main.go
Title My first post