Mysql: nullを*文字列にスキャンできません

作成日 2013年02月28日  ·  15コメント  ·  ソース: go-sql-driver/mysql

以前はGoogleCodeのコードを使用していました。 マスターで最新のコードに更新した後、以前は発生しなかった次のエラーが発生します。

sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string

私はもっ​​と調査しますが、おそらくその間にあなたはこれについてすでに何か知っていますか?

wontfix

最も参考になるコメント

このページはまだ検索結果でかなり高い位置に表示されているので、私の2セント:

また、問題が実際に存在する部分、つまりデータベースの抽象化レベルでも解決できます。 次の手順を実行することで、この問題を回避できます。

  SELECT
    id,
    COALESCE(name, '') as name
  FROM users

このように、 nameにNULLが含まれている場合、スキャン時に空の文字列に置き換えられます。 Coalesceは広くサポートされています。

全てのコメント15件

古いコードは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)) // => ""

http://play.golang.org/p/nivY1yBK3x

多分これを開いたままにして、多分例のために良い

解決策: 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を作成する必要があります。 ここでは問題ありません。これは適切で正しいアプローチですが、すべての場合に意味があるわけではなく、言語の制限により追加の作業になる可能性があります。

このページは役に立ちましたか?
0 / 5 - 0 評価