嘿,我收到一条错误消息: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.Db
是 pgx.Connect(context.Background(), os.Getenv("PSQL_URL"))
我在很短的时间间隔内从两个单独的前端请求中获取两个不同的表。
第一个请求通过,另一个请求返回conn busy
错误消息。
我真的不知道要找什么,有人可以帮我吗?
我正在尝试在 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) 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”
如果我使用 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)
请告诉我如何记录我的查询?
我有以下用于连接 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
可以让后台进程实现 …
我想使用 pgx 库扫描字符串数组,而不理想地使用 pq 。有没有办法做到这一点:
sourceKeys := make([]string, 0, 1)
err := rows.Scan(
pq.Array(&sourceKeys),
)
Run Code Online (Sandbox Code Playgroud)
不使用 pq 库?
我正在使用sqlc
and 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) 我正在开发一个简单的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
是没有意义的......text
string
在我看来,这不是使用这些类型的最佳方式,这对我来说是违反直觉的。所以我的问题是,我做得对吗?有不同的方法吗?最终,有没有一种方法可以配置 …
在 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)
该PreparedStatement
类型没有定义任何方法。一个新命名的准备好的语句是由以下方式准备的:
func (p *ConnPool) Prepare(name, sql string) (*PreparedStatement, error)
Run Code Online (Sandbox Code Playgroud)
在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) 或者,我还需要哪些额外的进口?
我想开始使用 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)
我已尝试过postgres
,postgresql
并且pgx
。
在所有情况下,对 connect 的调用都会失败并出现错误:
sql: unknown …
Run Code Online (Sandbox Code Playgroud)