Выполнение примера сценария с использованием библиотеки github.com/mgutz/dat - PullRequest
0 голосов
/ 06 апреля 2020

По историческим причинам я пытаюсь запустить упрощенный пример сценария, используя github.com/mgutz/dat, Postgres инструментарий доступа к данным. Я попытался скопировать пример сценария в этом репозитории https://github.com/kurtpeek/postgres-update со следующим main.go:

package main

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/lib/pq"
    "gopkg.in/mgutz/dat.v1"
    runner "gopkg.in/mgutz/dat.v1/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=dat_test user=dat password=!test 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
    err := DB.
        Select("id, title").
        From("posts").
        Where("id = $1", 13).
        QueryStruct(&post)
    fmt.Println("Title", post.Title)
}

Однако сценарий не компилируется, и я получаю следующая ошибка:

> go run main.go
go: finding github.com/mgutz/logxi latest
build command-line-arguments: cannot load github.com/mgutz/logxi: cannot find module providing package github.com/mgutz/logxi

Возможно, это связано с тем, что пакеты в этом репо (https://github.com/mgutz/logxi) находятся в каталоге v1.

Есть ли В любом случае, я мог бы исправить это, если бы не разветвление репо mgutz/dat и исправление его зависимостей?

1 Ответ

0 голосов
/ 06 апреля 2020

Оказывается, есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...