【问题标题】:replace variables with structs queriing with golang用golang查询的结构替换变量
【发布时间】:2017-08-02 07:11:21
【问题描述】:

我有这个有效的代码:

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
)

和 错误 = 行。扫描( &姓名, )

使用结构?

我问这个是因为每次我想添加新字段时都需要

  • 在查询中添加字段
  • 在“var”块中创建新变量
  • 添加要扫描的变量

我可以在一个地方定义一个结构并更新字段吗?或者,......是否有一些最佳实践来构建查询并获取它们?

【问题讨论】:

  • 不应该是rows.Scan()中的&username吗?
  • 我为此提交了编辑。结果我今天做了 2k 代表,所以我现在可以直接编辑它,但这实际上会在列表中颠簸它,所以它不会有生产力。

标签: go


【解决方案1】:

你可以这样做:

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)
}

【讨论】:

  • 然而,它更好。但是,您不只是为每个字段声明每个变量,而是建议创建一个结构。这是您每次扫描行时常用的方式吗?
  • 是的,我想是的。您可以尝试使用反射进行概括,但随后您会绕过 go 的类型系统——使其速度较慢且容易出错。
  • 你也可以看看gorm。我没有使用它,但它似乎无处不在。这样你就可以避免自己做数据库层。
【解决方案2】:

如果您愿意使用图书馆,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多