2017-08-02 161 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