标签: pgx

如何在很短的时间间隔内/同时进行多个查询

嘿,我收到一条错误消息:conn busy来自 pgx

我不知道如何解决这个问题。这是我的功能:

func (r *proverbRepo) SelectPendingProverbs(table string) (proverbs []domain.Proverb, err error) {
    query := fmt.Sprintf("SELECT id, proverb literal FROM %s", table)
    rows, err := r.Db.Query(context.Background(), query)
    defer rows.Close()

    if err != nil {
        return
    }

    for rows.Next() {
        var prov domain.Proverb
        if err = rows.Scan(&prov.ID, &prov.Literal); err != nil {
            return
        }
        proverbs = append(proverbs, prov)
    }
    return
}
Run Code Online (Sandbox Code Playgroud)

r.Dbpgx.Connect(context.Background(), os.Getenv("PSQL_URL"))

我在很短的时间间隔内从两个单独的前端请求中获取两个不同的表。

第一个请求通过,另一个请求返回conn busy错误消息。

我真的不知道要找什么,有人可以帮我吗?

go psql pgx

9
推荐指数
2
解决办法
3093
查看次数

使用 pgx 在 GO 中的 Postgres 中批量插入

我正在尝试在 go 中的 db 中批量插入键,这里是代码 Key Struct

type tempKey struct {
keyVal  string
lastKey int
Run Code Online (Sandbox Code Playgroud)

}

测试键

data := []tempKey{
    {keyVal: "abc", lastKey: 10},
    {keyVal: "dns", lastKey: 11},
    {keyVal: "qwe", lastKey: 12},
    {keyVal: "dss", lastKey: 13},
    {keyVal: "xcmk", lastKey: 14},
}
Run Code Online (Sandbox Code Playgroud)

插入部分

dbUrl := "db url...."
conn, err := pgx.Connect(context.Background(), dbUrl)
if err != nil {
    println("Errrorr...")
}
defer conn.Close(context.Background())
sqlStr := "INSERT INTO keys (keyval,lastval) VALUES "
dollars := ""
vals := []interface{}{}
count := 1
for _, row …
Run Code Online (Sandbox Code Playgroud)

postgresql go pgx

9
推荐指数
2
解决办法
2万
查看次数

pgx.ErrNoRows 与查询返回的错误不匹配

pgx 的新人。使用 pgxpool。我有一个简单的查询

var result string
err := Conn.QueryRow(context.Background(),
    `SELECT name FROM table WHERE id=1000`).Scan(&result)

if err != nil {
    if err == pgx.ErrNoRows {
        fmt.Println("No Rows")
        fmt.Println(err)
    } else {
        fmt.Println("Other Error")
        fmt.Println(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

即使实际上没有返回任何行,我也永远不会得到“无行”。错误总是“结果集中没有行”,但它永远不会匹配 pgx.ErrNoRows,因为我知道它们应该是相同的。

在检查类型时,pgx.ErrNoRows = *errors.fundamental 而 err = *xerrors.errorString。

我在做什么或假设做什么?

编辑:

正如下面@mkopriva提到的,问题是goimport自动导入了错误的pgx,它需要是“github.com/jackc/pgx/v4”

postgresql go pgx

7
推荐指数
0
解决办法
7047
查看次数

如何使用 pgx 记录查询?

如果我使用 pgx 池,我找不到如何记录 sql 查询的文档。例如我创建了这样的池:

func DB() *pgxpool.Pool {
    connStr := os.Getenv("DATABASE_URL")
    conn, err := pgxpool.Connect(context.Background(), connStr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
        os.Exit(1)
    }
    return conn
}
Run Code Online (Sandbox Code Playgroud)

请告诉我如何记录我的查询?

go pgx

7
推荐指数
2
解决办法
8803
查看次数

pgxpool.Connect 返回的池为 nil 或快速变为 nil 而不会出现错误

我有以下用于连接 Postgres 数据库的代码:

func connectToPostgres(ctx context.Context, url string) (*pgxpool.Pool, error) {
    var err error
    for i := 0; i < 5; i++ {
        p, err := pgxpool.Connect(ctx, url)
        if err != nil || p == nil {
            time.Sleep(3 * time.Second)
            continue
        }
        log.Printf("pool returned from connect: %s", p)
        return p, nil
    }
    return nil, errors.Wrap(err, "timed out waiting to connect postgres")
}
Run Code Online (Sandbox Code Playgroud)

用例是在使用 docker-compose 启动我的服务器时等待 Postgres 变得可用。即使代码休眠 if p == nil,第一个返回之前的日志也会打印出来:pool returned from connect: %!s(*pgxpool.Pool=<nil>)

有什么办法pgxpool可以让后台进程实现 …

go pgx

6
推荐指数
1
解决办法
1864
查看次数

jackc pgx 扫描阵列

我想使用 pgx 库扫描字符串数组,而不理想地使用 pq 。有没有办法做到这一点:

sourceKeys := make([]string, 0, 1)
err := rows.Scan(
    pq.Array(&sourceKeys),
)
Run Code Online (Sandbox Code Playgroud)

不使用 pq 库?

postgresql go pq pgx

6
推荐指数
0
解决办法
2503
查看次数

sqlc + pgx:用户定义枚举数组:无法扫描文本格式的未知类型(OID 16385)

我正在使用sqlcand pgx/v5,并且对于用户定义的枚举类型的 postgres 数组出现以下错误:

Error: can't scan into dest[1]: cannot scan unknown type (OID 16385) in text format into *pgtype.Array[my-app/sqlc.Option]

架构和查询:

CREATE TYPE option AS ENUM (
    'OPT_1',
    'OPT_2',
    'OPT_3'
);

CREATE TABLE IF NOT EXISTS blah (
    id BIGINT PRIMARY KEY,
    options option[] NOT NULL DEFAULT '{OPT_1}'
);

-- name: CreateBlah :one
INSERT INTO blah (
    id
) VALUES (
    $1
)
RETURNING *;
Run Code Online (Sandbox Code Playgroud)

sqlc似乎正确生成了类型:

CREATE TYPE option AS ENUM (
    'OPT_1',
    'OPT_2',
    'OPT_3'
); …
Run Code Online (Sandbox Code Playgroud)

arrays enums go pgx sqlc

6
推荐指数
1
解决办法
1333
查看次数

Go - 使用 pgtypes 的正确方法

我正在开发一个简单的Go服务来连接到数据库以进行基本查询。我用来sqlc生成Go与数据库交互的函数。lib/pq当从现在切换驱动程序时,pgx/v5数据库字段的类型而pgtypes不是Go类型。这是一个例子:

而不是这个:

    type ListAccountsParams struct {
        Owner  string `json:"owner"`
        Limit  int32  `json:"limit"`
        Offset int32  `json:"offset"`
    }
Run Code Online (Sandbox Code Playgroud)

我现在明白了:

    type ListAccountsParams struct {
        Owner  pgtype.Text `json:"owner"`
        Limit  pgtype.Int4 `json:"limit"`
        Offset pgtype.Int4 `json:"offset"`
    }
Run Code Online (Sandbox Code Playgroud)

然而我发现使用的唯一方法pgtypes是这个:

    owner := pgtype.Text{
        String: "Craigs List",
        Valid: true,
    }
Run Code Online (Sandbox Code Playgroud)

而不是仅仅做owner := "Craigs List"。对于数字类型就更矫枉过正了,我找到的所有实现都是这样的:

    pgtype.Numeric{
    Int: big.NewInt(-543), 
    Exp: 3, 
    Status: pgtype.Present
    }
Run Code Online (Sandbox Code Playgroud)

使用sqlc配置文件,我可以覆盖这些类型以支持标准类型,但对我来说必须覆盖 postgres类型等等Go是没有意义的......textstring

在我看来,这不是使用这些类型的最佳方式,这对我来说是违反直觉的。所以我的问题是,我做得对吗?有不同的方法吗?最终,有没有一种方法可以配置 …

go libpq pgx sqlc

6
推荐指数
1
解决办法
862
查看次数

在 pgx lib 中命名准备好的语句,它是如何工作的?

介绍

数据库/sql

在 Go 标准 sql 库中,该*Stmt类型具有如下定义的方法:

func (s *Stmt) Exec(args ...interface{}) (Result, error)
func (s *Stmt) Query(args ...interface{}) (*Rows, error)
Run Code Online (Sandbox Code Playgroud)

新的(未命名的)语句由以下人员准备:

func (db *DB) Prepare(query string) (*Stmt, error)
Run Code Online (Sandbox Code Playgroud)
  1. 连接池是抽象的,不能直接访问
  2. 在单个连接上准备事务
  3. 如果连接在语句执行时不可用,它将在新连接上重新准备。

PGX

PreparedStatement类型没有定义任何方法。一个新命名的准备好的语句是由以下方式准备的:

func (p *ConnPool) Prepare(name, sql string) (*PreparedStatement, error)
Run Code Online (Sandbox Code Playgroud)
  1. 操作直接在连接池上
  2. 事务在池的所有连接上准备就绪
  3. 没有明确的方法如何执行准备好的语句

Github 评论中,作者更好地解释了 pgx 和 database/sql 之间架构的差异。的文档Prepare还指出(强调我的):

Prepare 是幂等的;即使用相同的名称和 sql 参数多次调用 Prepare 是安全的。这允许使用Prepare 和 Query/Exec/PrepareEx代码路径,而无需担心语句是否已准备好。

小例子

package main

import (
    "github.com/jackc/pgx"
)

func main() …
Run Code Online (Sandbox Code Playgroud)

postgresql go pgx

5
推荐指数
1
解决办法
3921
查看次数

我应该使用什么驱动程序名称来使用 pgx 驱动程序将 Go sqlx 连接到 Postgres?

或者,我还需要哪些额外的进口?

我想开始使用 Postgres 作为我正在进行的一些开发的主要 DBMS,我的研究表明这pgx是目前选择的数据库驱动程序。我已经设置了一个连接包:

package database

import (
    "fmt"
    _ "github.com/jackc/pgx/v5"
    "net/url"

    "github.com/jmoiron/sqlx"
    log "github.com/sirupsen/logrus"
)

func PgConnect(username, password, host, app string) *sqlx.DB {
    s := fmt.Sprintf("postgres://%s:%s@%s?app+name=%s&sslmode=allow", url.QueryEscape(username), url.QueryEscape(password), host, app)
    db, err := sqlx.Connect("postgres", s)
    if err != nil {
        log.Panicf("failed to connect to sqlserver://%s:%s@%s err: %s", username, "xxxxxxxxxxxx", host, err)
    }

    return db
}
Run Code Online (Sandbox Code Playgroud)

URL 的计算结果为:

postgres://user:password@database-host:5432/database-name?app+name=app-name&sslmode=allow
Run Code Online (Sandbox Code Playgroud)

我也尝试过postgresql这里的前缀,因为我在互联网上的地方都看到过这两个前缀。

对于呼叫中的驱动程序名称sqlx.Connect("postgres", s)我已尝试过postgrespostgresql并且pgx

在所有情况下,对 connect 的调用都会失败并出现错误:

sql: unknown …
Run Code Online (Sandbox Code Playgroud)

postgresql go sqlx pgx

5
推荐指数
1
解决办法
4326
查看次数

标签 统计

go ×10

pgx ×10

postgresql ×5

sqlc ×2

arrays ×1

enums ×1

libpq ×1

pq ×1

psql ×1

sqlx ×1