转载

Golang 1.6: 数据库操作的2点疑惑

本文是用于Golang 1.6, 2016-5-3版本的 https://github.com/go-sql-driver/mysql

在使用Go进行MySQL操作时,发现两个有些疑惑的问题。

1. DB或者Tx的QueryRow和error问题

DB 或者 Tx 对象的 QueryRow 并不会像其他接口会立即返回 error ,它只会返回一个 *Row 对象,然后通过调用 Row.Scan 才会知道是否有错误。问题就是,调用 Scan 需要准备数据(比如声明一大堆变量或者初始化一个对象),而如果出现错误(没有结果的话也算错误,会返回 sql.ErrNoRows ),这些数据是完全没必要的。

2. 调用Query无法获取行数的问题

调用 DB 或者 Tx 对象的 Query 后返回的 Rows 对象只能通过 Next 来逐步抽取每个结果,无法提前知道 Rows 的长度(不考虑使用SQL中的 COUNT 语句),这样的话收集数据往往需要一直调用 append 来不停地把数据追加到Slice内,当长度大于Slice的Capacity时, append 必然要进行重新的内存分配以及元素的复制操作,如果能提前知道长度当然最好。

原文  https://www.mgenware.com/blog/?p=3079
正文到此结束
Loading...