2017-01-09 1 views
0

行を検索します。次はリストの最後に移動し、最初に戻らないようにしますか?私は、データベース内の特定のオブジェクトのデータがあるかどうかを調べるクエリを実行したい。そのオブジェクトがあれば、私はそれを更新したい。それがなければ、私は新しい行を挿入したい。だから私はこれを行う:golang sqldatabase rowss.Next

rows, err := db.Query(query) 
    if err != nil { 
     Error.Printf("error querying: %v", err) 
    } 

    if !rows.Next() { 
     // insert new data 
    } 

それは私の期待どおりに自分自身で動作します。私が代わりとスニペットの末尾に複数の論理でこれを行う場合は:rows.Nextため

rows, err := db.Query(query) 
    if err != nil { 
     Error.Printf("error querying: %v", err) 
    } 

    if !rows.Next() { 
     // insert new data 
    } 
    for rows.Next() { 
     fmt.Println("-----") 
     // do update 
    } 

私の()入力されることは決してありません。 if !rows.Next()ブロックの上にあるfor rows.Next()ブロックを移動すると、期待通りに機能します。だから、あなたが次のクエリを呼び出すときに何か起こることはありますか?前もって感謝します。

+0

を 'rows.Nextは()'、結果セットのインデックスを進めます。成功した場合はtrueを返し、失敗した場合はfalseを返します(つまり、データがなくなった場合)。そのインデックスを進めることなくデータがあるかどうかを調べる方法はないので、最初に 'rows.Next()'を呼び出すと、データがあるかどうかを調べるだけでなく、そのインデックスも進められます。 1行だけ戻ってきた場合、条件は偽(データがあります)ですが、ループは発生しません(最初の行の後にデータがなくなります。 – Kaedys

答えて

0

あなたは、おそらくこのような何かしたい:それは可能であれば

rows, err := db.Query(query) 
if err != nil { 
    Error.Printf("error querying: %v", err) 
} 
shouldinsert := true 
for rows.Next() { 
    shouldinsert = false 
    fmt.Println("-----") 
    // do update 
} 
if shouldinsert { 
    // insert new data 
}