gpt4 book ai didi

出现错误时 PostgreSQL 不返回完整的响应

转载 作者:数据小太阳 更新时间:2023-10-29 03:02:58 26 4
gpt4 key购买 nike

当我运行导致错误的查询时,我遇到了一个问题。

例如,如果我运行以下查询

SELECT * FROM users WHERE account_id=1;

用户表没有 account_id 列。

正确的错误信息返回:

 00000000  45 00 00 00 6e 53 45 52  52 4f 52 00 56 45 52 52  |E...nSERROR.VERR|
00000010 4f 52 00 43 34 32 37 30 33 00 4d 63 6f 6c 75 6d |OR.C42703.Mcolum|
00000020 6e 20 22 61 63 63 6f 75 6e 74 5f 69 64 22 20 64 |n "account_id" d|
00000030 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 00 50 32 |oes not exist.P2|
00000040 37 00 46 70 61 72 73 65 5f 72 65 6c 61 74 69 6f |7.Fparse_relatio|
00000050 6e 2e 63 00 4c 33 32 39 33 00 52 65 72 72 6f 72 |n.c.L3293.Rerror|
00000060 4d 69 73 73 69 6e 67 43 6f 6c 75 6d 6e 00 00 5a |MissingColumn..Z|
00000070 00 00 00 05 49 |....I|

注意响应的结尾。

但时不时地,我会从 PostgreSQL 收到以下响应。

 00000000  45 00 00 00 6e 53 45 52  52 4f 52 00 56 45 52 52  |E...nSERROR.VERR|
00000010 4f 52 00 43 34 32 37 30 33 00 4d 63 6f 6c 75 6d |OR.C42703.Mcolum|
00000020 6e 20 22 61 63 63 6f 75 6e 74 5f 69 64 22 20 64 |n "account_id" d|
00000030 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 00 50 32 |oes not exist.P2|
00000040 37 00 46 70 61 72 73 65 5f 72 65 6c 61 74 69 6f |7.Fparse_relatio|
00000050 6e 2e 63 00 4c 33 32 39 33 00 52 65 72 72 6f 72 |n.c.L3293.Rerror|
00000060 4d 69 73 73 69 6e 67 43 6f 6c 75 6d 6e 00 00 |MissingColumn..|

然后客户端无法解析响应,因为它缺少结尾。

这是我做错了什么,还是这可能是 PostgreSQL 中的错误?

我在 Golang 的 net.Conn 中通过 Read() 收到来自 PostgreSQL 的响应

想法?

创建表的脚本:

 DROP TABLE IF EXISTS ready.public.users;

CREATE TABLE ready.public.users
(
user_id UUID NOT NULL,
email VARCHAR(325) NOT NULL,
password VARCHAR(2000) NULL,
first_name VARCHAR(200) NULL,
last_name VARCHAR(200) NULL,
global_permissions BIGINT DEFAULT 1 NOT NULL,
is_system BOOLEAN NOT NULL DEFAULT false,
is_device_only BOOLEAN NOT NULL DEFAULT false,
date_created TIMESTAMP NOT NULL,
date_updated TIMESTAMP NULL,
date_last_logged_in TIMESTAMP NULL,
date_last_seen TIMESTAMP NULL
);

我的 golang 库中的代码。

 rConn.Write(buf.Bytes())

data := make([]byte, 2048)
n, err := rConn.Read(data)
data = data[:n]
if err != nil {
if err != io.EOF {
panic(err)
} else {
log.Printf("received err: %v", err)
}
}

buf.Bytes() 的值为:

 00000000  50 00 00 00 2e 00 53 45  4c 45 43 54 20 2a 20 46  |P.....SELECT * F|
00000010 52 4f 4d 20 75 73 65 72 73 20 57 48 45 52 45 20 |ROM users WHERE |
00000020 61 63 63 6f 75 6e 74 5f 69 64 3d 31 00 00 00 42 |account_id=1...B|
00000030 00 00 00 0c 00 00 00 00 00 00 00 00 44 00 00 00 |............D...|
00000040 06 50 00 45 00 00 00 09 00 00 00 01 f6 53 00 00 |.P.E.........S..|
00000050 00 04 |..|

更改我的代码以读取来自 postgresql 的响应仍然会导致来自服务器的相同响应。

 rBuf := &bytes.Buffer{}
for {
data := make([]byte, 256)
n, err := rConn.Read(data)
if err != nil {
panic(err)
}
rBuf.Write(data[:n])
if n < 256 {
break
}
}
go log.Printf("received:\n%v", hex.Dump(rBuf.Bytes()))

最佳答案

是否遇到了 panic 并打印错误消息?是否在读取完成之前跳出循环?

在“更改的代码”部分,您甚至在 io.EOF 上都感到 panic ,并且在这种情况下您没有对读取的字节做任何事情。尝试删除 panic,并在错误处理之前使用读取的字节(就像在“之前”代码段中一样),然后循环直到出现读取错误。我至少想找出/测试:

buf := new(bytes.Buffer)
for {
data := make([]byte, 2048)
n, err := rConn.Read(data)
if n > 0 {
buf.Write(data[:n])
}
if err != nil {
log.Printf("Error reading from connection: %s\n", err)
break
}
}
log.Printf("Received: %s\n", buf.String())

关于出现错误时 PostgreSQL 不返回完整的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com