以前はGoogleCodeのコードを使用していました。 マスターで最新のコードに更新した後、以前は発生しなかった次のエラーが発生します。
sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string
私はもっと調査しますが、おそらくその間にあなたはこれについてすでに何か知っていますか?
古いコードはNULL
値に対して空の[]byte
を返したため、 NULL
値と空の文字列を区別できません
詳細については、問題#20を参照してください。
この目的のために、エラーはdatabase/sql
パッケージによって返されます。
* Be flexible with type conversions, but be paranoid about silent
truncation or other loss of precision.
列にNULL値が含まれている可能性がある場合は、 http://golang.org/pkg/database/sql/#NullStringを使用する必要があります
ありがとう、それは理にかなっています。
古い動作を提供するようにライブラリを構成する方法がほとんど必要です。 ある意味で、Goの「デフォルトとしてのゼロ値」は非常に理にかなっており、大量の定型コードを排除します。 NULLに遭遇する可能性のあるコード内のいたるところに分散させるのではなく、構成可能に1つの場所に配置したいと思います。 NullStringなどを使用することは、コード的にはかなり醜いです。
NULLは単なる悪夢であり、NULLを取り除きたいと思っています。 _my_テーブルのすべての列をNOTNULLとして明示的に定義しますが、SHOW PROCESSLISTのようなコマンドにNULLが含まれることがあり、コードは気にしません。 代わりに空の文字列が必要です。 NullStringを使用し、その.Validプロパティを無視して、.Stringを取得します。これは、列がNULLの場合は空になります。
型のNULLをゼロ値に変換するようにドライバーに指示できると(または実際には、列の変数へのスキャンをスキップすることになると思います)、多くの困難でエラーが発生しやすいものを減らすことができます(将来性のある)私のために働きます。 または、すべての定型コードが必要ない場合は、列a)が本当にnull許容ではないb)その状態が永遠に続く可能性があります。
また、データベース/ SQLパッケージはGoの「デフォルトのゼロ値」ポリシーに従うことをお勧めします。 必要に応じてNull *タイプと区別することもできますが、残念ながら、設計上の決定はこの方法で行われました。 たぶん彼らはGo2でそれを変更します(そのために私から+1)。
今のところ、そのためのドライバーオプションを追加する予定はありません。 PostgreSQLと比較すると、プロトコルはすでに混乱しています(私はより効率的だと思いますが)。 私はこれ以上ドライバーを混乱させたくありません。
スキャンされた文字列ごとに1 str = nullStr.Value
多い
NULL
値をゼロにするオプションを追加しようとしました: https :
しかし、それはドライバーレベルでは不可能です。 ゼロ値を[]byte{}
に設定すると、 string
と[]byte
スキャンできますが、数値タイプにはスキャンできません。 0
に設定すると、数値タイプにスキャンできますが、 string
/ []byte
として「0」を取得します。
ドライバーが実際にどのようにスキャンするかはよくわかりませんが、代わりに
dest [i]を何かに設定すると、ドライバーが設定をスキップした場合はどうなりますか
dest [i]?
dest
は基本的に[]interface{}
スライスです。 interface{}
のデフォルト値はnil
です。 したがって、 dest[i]
設定をスキップすると、 dest[i]=nil
設定と同じ結果になります。
ブランチを更新しました。 必要に応じて、自分で試してみることができます。
それは私のニーズにぴったりのようです。次回更新するときに試してみます
ドライバーのコピー。
別の回避策が頭に浮かびました。
文字列の代わりに[] byteを使用してください。 nil- [] byteを変換すると、空の文字列になります。
string([]byte("")) // => ""
string([]byte(nil)) // => ""
多分これを開いたままにして、多分例のために良い
解決策: https :
このページはまだ検索結果でかなり高い位置に表示されているので、私の2セント:
また、問題が実際に存在する部分、つまりデータベースの抽象化レベルでも解決できます。 次の手順を実行することで、この問題を回避できます。
SELECT
id,
COALESCE(name, '') as name
FROM users
このように、 name
にNULLが含まれている場合、スキャン時に空の文字列に置き換えられます。 Coalesceは広くサポートされています。
文字列がnullのときになぜ例外がスローされたのかわかりません
この例は私のために働きます
次のように処理するために文字列ポインタを渡すことができます。
var txt *string
checkErr(result.Scan(&txt))
// do something with type *string
それは私にとってはうまくいきます。
@Dynom偉大なコメントのほかに、私はまだことを言及する価値があることができると思いますsql.NullString
あなたが先に問題を解決したい場合に便利来るタイプScan
私は行く側として見ています(データベース抽象化レベルの)。
さらに、 nil
値と空の文字列を区別する機能を保持します。
nullstringを使用すると、たとえばjsonのような情報を表示する場合、開発者はマップvoを作成する必要があります。 ここでは問題ありません。これは適切で正しいアプローチですが、すべての場合に意味があるわけではなく、言語の制限により追加の作業になる可能性があります。
最も参考になるコメント
このページはまだ検索結果でかなり高い位置に表示されているので、私の2セント:
また、問題が実際に存在する部分、つまりデータベースの抽象化レベルでも解決できます。 次の手順を実行することで、この問題を回避できます。
このように、
name
にNULLが含まれている場合、スキャン時に空の文字列に置き換えられます。 Coalesceは広くサポートされています。