我的代码片段有效:
db, err := sql.Open("mysql", "pwd@tcp(ip:port)/db")
if err != nil {
panic(err.Error())
}
rows, err := db.Query("select username from users")
if err != nil {
panic(err.Error())
}
var (
username string
)
for rows.Next() {
err = rows.Scan(
&name,
)
if err != nil {
panic(err)
}
fmt.Println(username)
}
但是,......是否可以替换
var (
username string
)
和 err = rows.Scan( &放大器;名称, )
带结构?
我问这个,因为每次我想要添加新字段时我需要
我可以在一个地方定义一个结构并更新字段吗?或者,......是否有一些最佳实践来构建查询并获取它们?
答案 0 :(得分:2)
您可以这样做:
type user struct {
Name string
Pass string
Email string
Age int
}
func main() {
db, err := sql.Open("mysql", "pwd@tcp(ip:port)/db")
if err != nil {
panic(err.Error())
}
rows, err := db.Query("select user, pass, email, age from users")
if err != nil {
panic(err.Error())
}
var (
users []user
)
for rows.Next() {
u := user{}
err = rows.Scan(
&u.Name, &u.Pass, &u.Email, &u.Age,
)
if err != nil {
panic(err)
}
users = append(users, u)
}
fmt.Println(users)
}
答案 1 :(得分:1)
如果您愿意使用图书馆,https://github.com/jmoiron/sqlx非常适合这项工作。
place := Place{}
rows, err := db.Queryx("SELECT * FROM place")
for rows.Next() {
err := rows.StructScan(&place)
if err != nil {
log.Fatalln(err)
}
fmt.Printf("%#v\n", place)
}
github自述文件https://github.com/jmoiron/sqlx中有一些基本用法,以及维护者编写的一些“标准”文档http://jmoiron.github.io/sqlx/,最后是godoc http://godoc.org/github.com/jmoiron/sqlx
需要注意的一点是,sqlx
使得设计选择类似于go编译器强制您使用已创建的变量的方式。因此,如果选择不在结构中的列,则会引发错误。其原因是合理的,并促进良好的sql
做法。 Select *
当你只需要一个专栏就很疯狂。在这里查看他的笔记http://jmoiron.github.io/sqlx/#safety