【发布时间】:2019-10-24 19:11:50
【问题描述】:
我使用 database/sql 并定义了到 DB 表列(标签字段)的结构映射:
// Users ...
type Users struct {
ID int64 `field:"id"`
Username string `field:"username"`
Password string `field:"password"`
Tel string `field:"tel"`
}
然后我查询:
rows, err := db.Query(sql) // select * from users
if err != nil {
fmt.Println(err)
}
defer rows.Close()
for rows.Next() {
user := new(Users)
// works but I don't think it is good code for too many columns
err = rows.Scan(&user.ID, &user.Username, &user.Password, &user.Tel)
// TODO: How to scan in a simple way
if err != nil {
fmt.Println(err)
}
fmt.Println("user: ", user)
list = append(list, *user)
}
if err := rows.Err(); err != nil {
fmt.Println(err)
}
正如您在rows.Scan() 中看到的那样,我必须编写所有列,而且我认为这不是 20 列或更多列的好方法。
如何清晰地扫描。
【问题讨论】:
-
让你的类型实现扫描器。或者使用 github.com/jmoiron/sqlx。
-
我只用过
database/sql和github.com/go-sql-driver/mysql。 -
@Rife 您可以使用
reflect自己完成此任务,但老实说,如果您真的想要这个,您可能应该考虑采用sqlx,因为它已经为您解决了这个问题。 -
@DominicBarnes 进一步反映了由于性能问题而被认为是不良做法。
-
@alexfwulf 它有影响,但我指出
sqlx因为它实现了这个解决方案并使用reflect这样做,所以你不需要自己实现它。
标签: go