2017-09-06 6 views
0

私はポググレとゴーにはかなり新しいですが、これでしばらくの間苦労しています。私は現在、テーブルからすべてを取得するクエリを送信しようとしています。 私はpostgresの内golang sqlを使用してpostgresでテーブル全体をどのように選択しますか?

SELECT * FROM land_registry_price_paid_uk 

を使用しようとすると、それはすべてのものを示しているが、私は、クエリを使用して同じことを行うとき、私は得ます。

sql: expected 16 destination arguments in Scan, not 1 

これは現在のコードです。

fmt.Printf("user: %s, password: %s, dbName: %s", user, password, dbName) 
connectionString := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=%s", user, password, dbName, "disable") 
var err error 
a.DB, err = sql.Open("postgres", connectionString) 
if err != nil { 
    log.Fatal(err) 
} 
rows, err := a.DB.Query("SELECT (*) FROM land_registry_price_paid_uk") 
if err != nil { 
    log.Fatal(err) 
} 
defer rows.Close() 
println(rows) 
for rows.Next() { 
    var name string 
    if err := rows.Scan(&name); err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("this is something: %s\n", name) 

何か助けていただければ幸いです。

+2

16個の列を1つの 'name'文字列にスキャンすることはできません。あなたは16のポインタ引数を 'Scan'呼び出しに渡す必要があります。 'SELECT * ... 'の代わりに' name'だけに興味があるなら、 'SELECT name ...'を実行するか、必要な列名を指定してください。 – mkopriva

答えて

2

クエリを使用して、データの16列を返すと、単一の文字列変数にそれらのすべてをスキャンしようとしている、だけで正常に動作しているように、あなたが列ごとにホルダー変数を提供する必要がありますルックス:

var name string 
// vars to hold other column values go here 

// then reference vars in table order as args to row.Scan below 
if err := rows.Scan(&name); err != nil { 
    log.Fatal(err) 
} 

あなたが使用していない場合は、SQL /また、あなたはおそらく、これらのほか必要になるので、NULL可能な値に対処するために提供される特別なタイプに見てみたいことがあります前に行く:

NullString example

アップデート:

さらに説明するために、あなたは次のフィールドで構成さ3列の表を持っていたと言う:

  • ID(int型)
  • 名(文字列)
  • optional_data(文字列、 NULL可能)

次のようにして、(テストされていない)行を読むかもしれない:

var (
    id int 
    name string 
    optionalData sql.NullString 
) 

if err := rows.Scan(&id, &name, &optionalData); err != nil { 
    log.Fatal(err) 
} 
+0

私は私がフォローしているか分からない。各列にホルダー変数を実装する方法について説明できますか? –

+0

例で更新されました – WebweaverD

関連する問題