2017-10-25 7 views
0

を構造体へのようなテーブルを想像してください:短いそれを維持するにはGolang SQLスキャンストレンジネス

type Dude struct { 
    Firstname string 
    Lastname string 
    Fee  int 
    Opt_out int 
} 

FirstName, LastName, Fee, Opt_Out 
String  String Int TinyInt(4) 

、そのように構造体私はにスキャンするデータベース/ SQLを使用していますTinyIntの場合を除いて、問題のない構造体。

err = rows.Scan(&firstname, &lastname, &fee, &opt_out) 

は、スキャンした後、そして私の構造体に値を割り当てる前に、I

fmt.PrintLn(Opt_out) 

、彼らは常にゼロ値を返します。 SQL Serverにクエリを直接接続すると、正しいものが得られ、ゼロの値が得られます。

私は、文字列への構造体の「OPT_OUT」の種類を変更しようとした、と

IF(Opt_out=1,"yes","no") 

を行うことにより、クエリ自体を経由してキャストしようとしたと同じようなことは、SQLでクエリの実行を起こっています期待される結果を返しますが、golangは空の値を返します。

私は空白を描いています。何か案は?

+0

使用しているSQL DBとドライバは何ですか?また、個々の値を明示的にスキャンすることなく、構造体全体を 'スキャン 'するライブラリがあることにも注意してください。 – RayfenWindspear

+0

Mariaとgo-sql-driver/mysql。私は他の場所で直接sqlstructマッピングを使用していますが、これは特殊なケースです。/ – Derek

+0

'bool'や' boolean'型を使用しない特定の理由はありますか?あなたの質問は、あなたは0または1だけを期待していることを意味します。 – RayfenWindspear

答えて

3

Jeez。これは明らかにtinyint自体とは関係がありませんでした。

データベースの「fee」列にNULL値が含まれていた場合、既存のクエリはnullを空の文字列に置き換えるように設定されていました。

IFNULL(fee,'') 

sqlドライバは非常に静かにそれらを見ていると思われ、後ですべてを処理することを断念しました。

私の修正では、IFNULL(手数料、0)を使用してクエリを実行していました。

ありがとうRayfenWindspear!私はあなたのフィードバックなしで余分なマイルを与えていないでしょう。

+1

嬉しいです。 – RayfenWindspear