Go sql.Driver的mysql Driver 中的一个有意思的行为

如果参数中没有参数, 则直接query.
如果sql中有参数, 且打开了InterpolateParams开关, 那么就客户端直接拼参数到SQL里, 不需要prepare直接query.
如果sql中有参数, 且没有打开InterpolateParams(默认设置), 且带参数, 就会走先prepare再发query参数两步.

github.com/go-sql-driver/mysql/connection.go:370
func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) {
//...
if len(args) != 0 {
if !mc.cfg.InterpolateParams {
return nil, driver.ErrSkip
}
// try client-side prepare to reduce roundtrip
prepared, err := mc.interpolateParams(query, args)
if err != nil {
return nil, err
}
query = prepared
}
// Send command
err := mc.writeCommandPacketStr(comQuery, query)
if err == nil {
// Read Result
// ...

后续再补篇文章详细写写sql.Driver

分享到 评论