2017-08-02 164 views
0

queriing替换变量我有这个代码片段的作品:与结构与golang

db, err := sql.Open("mysql", "[email protected](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 =行。扫描( &名称, )

带结构?

我问这个,因为我每次要添加新的领域,我需要

  • 添加查询场内
  • 创建“VAR”块
  • 新变量添加变量扫描

我可以在一个地方定义一个结构和更新字段吗?或者,有没有一些最佳做法来构建查询并获取它们?

+0

不应该是'&username'在rows.Scan()中? – schrej

+0

我为此提交了一个编辑。原来我今天做了2k的代表,所以我现在可以直接编辑它,但它有效地将它列入列表中,所以它不会有生产力。 – RayfenWindspear

回答

2

你可以做这样的事情:

type user struct { 
    Name string 
    Pass string 
    Email string 
    Age int 
} 

func main() { 
    db, err := sql.Open("mysql", "[email protected](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) 
} 
+0

但是,它更好。但是,不要只为每个字段声明每个变量,而只是建议您创建一个结构体。这是您每次扫描行时使用的常用方式吗? – sensorario

+0

是的,我认为是。你可以尝试使用反射来概括,但是你可以绕过去式的系统 - 使它变得更慢并且容易出错。 – TehSphinX

+0

你也可以看看[gorm](http://jinzhu.me/gorm/)。我没有使用它,但它似乎到处都是。这样你就避免了自己做数据库层。 – TehSphinX

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