问题标签 [pq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - lib/pq:查询数据库时出现运行时错误
我正在为我的 Go 后端设置 PostgreSQL 数据库,但在尝试读取表时出现此错误:
这是错误指向(main.go:63
)的地方:
employees
它应该返回我在表上手动创建的两行。注意我已成功连接到数据库,只是查询时出错。
去版本:go version go1.12.7 linux/amd64
有人能帮忙吗?
postgresql - 如何获取 unique_constraint 违规的列名?
我正在使用 pq 驱动程序,我想知道为什么当我面临唯一约束违规时 pq.Error 会给出一个空列。
我可以解析Detail
,但有什么理由为什么Column
会是空的?如果我能从中获取email
而Column
不是解析会更好Detail
这是错误的样子:
不幸的是,该Column
值为空。我正在尝试为我的应用程序提供错误消息,我想知道是否有某种方法可以获取该信息,以便我可以增强未创建实体的消息并让调用者知道该字段(email
在这种情况下) 也是如此。
sql - sql:预期 0 个参数,得到 2 个
我正在努力正确利用Postgressqlx
的pq
驱动程序来在数据库中创建一行。让我们从简单的开始:
我有一个user
,role
和user_role
表。我想在数据库中插入一个角色并获取插入行的 ID。使用以下 sql 可以完美地工作:
const createRoleSQL = "INSERT INTO role (name) VALUES (:name) RETURNING id"
为了使这项工作顺利进行,我在某个时候准备了声明:
创建时,我将查询作为事务的一部分运行tx
。role
显然是具有正确字段和db
标签的结构:
这工作得很好。
现在我想扩展它并插入一个新角色并将其分配给用户:
不幸的是,这失败了sql: expected 0 arguments, got 2
。是否可以通过单个查询来实现我想要做的事情?
postgresql - 不能从 db.QueryRow() 推断出错误
我正在尝试实现一个简单的 POST API 来在 Postgres DB 上插入数据,如下所示:
http://123.123.10.10/checkin?userid=clive&token=1234jhhasdbn
Go 编译器(我正在使用 v1.13)抱怨:
.\checkin.go:63:2:未定义:错误
.\checkin.go:65:6: undefined: err
如何解决这个问题?
postgresql - 转换参数 $1 类型:不支持的类型 []interface {},接口切片
我尝试查询用户 ID 列表。我正在使用 Go Pq库。
当我运行它时,它给出了错误转换参数 $1 type: unsupported type []interface {}, a slice of interface
cockroachdb - pq.NewListener/Listen 带有 pq 的块:在“listen”处或附近出现语法错误
我在 cockroachdb (postgres db) 中有带有 lambda 通知的 minio/s3 对象存储。我正在尝试使用以下 golang 代码监视这些事件。
当我运行这个程序时,我看到以下错误并且卡住了。
手动连接到 cockroachdb 可以正常工作。
任何想法为什么会出错pq: syntax error at or near "listen"
。我也在查看 pq 来源,该错误很可能与notify.go#L756有关
database - 在 for 循环中使用 db 连接时内存泄漏
我正在尝试在无限 for 循环中连续查询 Postgres 数据库。但是,查询似乎没有关闭,垃圾收集器可能无法正常工作,并且我面临内存分配问题。
脚本设计如下:
在func main()
我声明一个全局数据库连接。然后执行func checkCross(...)
which 包含 for 循环,每次迭代执行func importPrices(...)
which 依次从数据库中导入行。
函数 checkCross(...)
函数导入价格(...)
输出
您能否指导我的代码或方法中的问题在哪里?我读过一些文章,他们建议rows.Close()
在 for 循环中使用而不是,defer rows.Close()
但这个解决方案不起作用。
go - Go 例程后关闭冗余 sql.Rows 对象的推荐方法
我正在使用 Go 例程将查询并行发送到 PostgreSQL 主节点和从节点。返回有效结果的第一个主机获胜。错误案例不在此问题的范围内。
调用者是唯一关心*sql.Rows
对象内容的人,所以我的函数故意不对这些内容进行任何操作。我使用缓冲通道从 Go 例程中检索返回对象,因此应该没有 Go 例程泄漏。垃圾收集应该照顾其余的。
有一个问题我没有正确解决:留在通道中的 Rows 对象永远不会关闭。当我从(只读)事务中调用此函数时,tx.Rollback()
为每个非关闭Rows
对象实例返回一个错误:"unexpected command tag SELECT"
.
从更高级别的对象调用此函数:
执行器可以是*sql.DB
,*sql.Tx
或者任何符合接口的东西:
回滚逻辑:
MultiTx
是多个节点上开放交易的集合。它是一个更高级别的对象,它调用multiQuery
“清理”未使用的行的最佳方法是什么?我正在考虑不做的选项:
cancel()
取消上下文:我相信它会不一致地工作,在调用时可能已经返回了多个查询- 创建一个延迟的 Go 例程,该例程继续耗尽通道并关闭行对象:如果 DB 节点响应缓慢,
Rollback()
仍会在之前调用rows.Close()
- 在 MultiTx 类型中的某处使用 a
sync.WaitGroup
,可能与 (2) 结合使用:如果其中一个节点无响应,这可能会导致 Rollback 挂起。另外,我不确定我将如何实现它。 - 忽略回滚错误:忽略错误听起来从来都不是一个好主意,它们的存在是有原因的。
解决此问题的推荐方法是什么?
编辑:
正如@Peter 所建议的那样,我尝试取消上下文,但这似乎也使查询中返回的所有行无效。在rows.Scan
我context canceled
在更高级别的调用者处遇到错误。
这是我到目前为止所做的:
编辑2:
@Adrian 提到:
我们看不到实际使用这些的代码。
此代码由类型方法重用。首先是交易类型。这个问题的问题出现在上面的Rollback()
方法上。
然后是:
这些方法是函数周围的公共包装器multiQuery()
。现在我意识到只是将其发送*Rows
到缓冲通道中死,实际上是内存泄漏。在交易案例中,它变得很清楚,因为Rollback()
开始抱怨。但是在非事务变体中,通道内部永远不会被垃圾收集,因为驱动程序可能会在调用*Rows
之前持有对它的引用。rows.Close()
我已经编写了这个包,供 ORM sqlboiler使用。我的更高级别的逻辑将一个MultiTX
对象传递给 ORM。从那时起,我对返回的Rows
. 一种简单的方法是我的更高级别的代码取消了之前的上下文Rollback()
,但我不喜欢这样:
- 它提供了一个非直观的 API。这种(惯用的)方法会破坏:
- ORM 的接口还指定了常规的、非上下文感知的
Query()
变体,在我的包的情况下,它将针对context.Background()
.
我开始担心这会被设计破坏...无论如何,我将首先实现一个 Go 例程,该例程将耗尽通道并关闭*Rows
. 之后我会看看我是否可以实现一些不会影响返回的合理等待/取消机制*Rows
go - pq QueryRow 扫描失败,内存地址无效或指针取消引用
我有以下函数应该从我的想法表中检索一行:
当我在测试中运行它时,会出现以下错误:
我似乎无法弄清楚问题所在。我相信我已经将 idea var 正确地实例化为指针,然后我在 Scan 方法中为其赋值。有没有人有什么建议?
postgresql - Postgres 返回 []uint8 而不是 []integer
我将整数数组保存到 PostgreSQL 表中,当尝试检索它时,我总是得到 []uint8 而不是 []int。我尝试使用 []integer、[]bigint、[]smallint。没有任何效果。该数组最多表示四个项目,每个项目在 1-100 之间,没有浮点数。
我正在使用 Go,并且我有一个 []int 对象,这是字段:
我正在尝试修复它,但找不到让 PostgreSQL 返回 []int 的方法。
所有其他表字段都工作得很好。该Quantity
字段的类型integer[]
这是插入查询:
这就是我尝试获取数据的方式。
问题仅在于数量。如果我改变我temp object
的[]uint8
而不是[]int
我得到字节。