【问题标题】:See query with arguments in Go database/sql package请参阅 Go database/sql 包中带参数的查询
【发布时间】:2014-01-04 08:12:10
【问题描述】:
我正在尝试测试将参数传递给 sql.DB.Query 方法的行为(使用 database/sql 包和github.com/lib/pq 的 PostgreSQL 驱动程序)。在处理原始查询字符串以查看如何插入参数后,有什么方法可以获取原始查询字符串?例如,我正在考虑编写一个准备好的查询,然后检查结果语句。有任何想法吗?谢谢!
【问题讨论】:
标签:
sql
go
arguments
prepared-statement
【解决方案1】:
“原始查询字符串”没有被客户端解析和插值;它被原封不动地传递给服务器。
如果查询没有参数,客户端将其发送为simple query;如果查询有参数,客户端将其作为extended query 发送,参数与查询分开。然后服务器解析查询并将其参数化。
Go 的 database/sql 不包含任何日志记录,因此您必须自己编写、使用 Wireshark 嗅探流量,或者在服务器端启用日志记录。
【解决方案2】:
它看起来不像在查询本身中插入参数。它发送查询,然后等待响应发送参数。我分叉了 pq 并放入了一些日志记录代码——这是一个简单查询的输出:
wes-macbook:testpq go run testpq.go
2014/01/03 19:08:56 bytes: [0 0 0 84 0 3 0 0 101 120 116 114 97 95 102 108 111 97 116 95 100 105 103 105 116 115 0 50 0 99 108 105 101 110 116 95 101 110 99 111 100 105 110 103 0 85 84 70 56 0 100 97 116 101 115 116 121 108 101 0 73 83 79 44 32 77 68 89 0 117 115 101 114 0 119 102 114 101 101 109 97 110 0 0]
2014/01/03 19:08:56 string: Textra_float_digits2client_encodingUTF8datestyleISO, MDYuserwfreeman
2014/01/03 19:08:56 bytes: [80 0 0 0 45 0 115 101 108 101 99 116 32 42 32 102 114 111 109 32 116 101 115 116 32 119 104 101 114 101 32 116 101 115 116 46 110 97 109 101 61 36 49 0 0 0]
2014/01/03 19:08:56 string: P-select * from test where test.name=$1
2014/01/03 19:08:56 bytes: [68 0 0 0 6 83 0]
2014/01/03 19:08:56 string: DS
2014/01/03 19:08:56 bytes: [83 0 0 0 4]
2014/01/03 19:08:56 string: S
2014/01/03 19:08:56 bytes: [66 0 0 0 20 0 0 0 0 0 1 0 0 0 4 97 115 100 102 0 0]
2014/01/03 19:08:56 string: Basdf
2014/01/03 19:08:56 bytes: [69 0 0 0 9 0 0 0 0 0]
2014/01/03 19:08:56 string: E
2014/01/03 19:08:56 bytes: [83 0 0 0 4]
2014/01/03 19:08:56 string: S
我所做的只是调整 send() 代码:
func (cn *conn) send(m *writeBuf) {
b := (*m)[1:]
binary.BigEndian.PutUint32(b, uint32(len(b)))
if (*m)[0] == 0 {
*m = b
}
// new code here
log.Println("bytes:", *m)
log.Println("string:", string(*m))
_, err := cn.c.Write(*m)
if err != nil {
panic(err)
}
}
我的示例代码,虽然很简单:
https://gist.github.com/8249430