defer rows.Close()
,容易使连接数得不到释放,或defer堆栈过多,导致内存占用过多。sql.DB
对象,否则会频繁打开和关闭对db的tcp连接,导致延时,以及过多的TIME-WAIT
。db.QueryRow()
和Scan()
应该在同一个链中使用。fmt.Sprintf
来避免参数绑定和prepare statements。Scan()
,它会在内部来帮你自动进行类型转换。database/sql
的功能来处理连接池,重连和重试逻辑,而不是显式编写逻辑。rows.Next()
可能会非正常退出,如果没有在内部检查错误,需要在rows.Next()
结束后用rows.Err()
来捕获rows里存放的错误。db.Exec()
。sql.Tx
或者同一个连接对象。sql.Tx
对象绑定了一个事务,而db则不是,这时候可能不会得到想要的结果。sql.NullXXX
的变量中。Query()
,Exec()
的参数,并且它的高位不为0,会抛出一个错误。References: