web-dev-qa-db-ja.com

スキャンエラー:サポートされていないスキャン、ドライバーを保存しています。値のタイプ<nil>をタイプ* stringに

写真なしで記事をmysqlデータベースから取得しようとすると、次のようになります。

func ArticlesAllText() ([]Article, error) {
    var err error
    var result []Article
    err = database.SQL.Select(&result, "SELECT * FROM Article WHERE photo IS NULL")
    if err != nil {
        log.Println(err)
    }
    return result, standardizeError(err)
}

私は得る

sql:列インデックス10のスキャンエラー:サポートされていないスキャン、driver.Valueタイプをタイプ* stringに保存しています

フィールド値がNULLの場合。

どうすれば修正できますか?

8
Karlom

sql.NullStringを使用します。

https://godoc.org/database/sql#NullString

個人的には、私はこのソリューションが嫌いです。そのため、NULLsがないようにDBを正規化します。

どちらかを変える

var result []Article

var result []sql.NullString

次に、それらの結果を取得し、ドキュメントのチェックを使用して[]Articleを作成します。

またはあなたの構造体で、変更してください

Photo *string

Photo sql.NullString

そして、それが*stringではなく構造体であるという煩わしさに対処してください。

ATNのおかげで、ガイドについてはこちらをご覧ください https://medium.com/aubergine-solutions/how-i-handled-null-possible-values-from-database-rows-in-golang-521fb0ee267 =

10
RayfenWindspear

以下の2つのソリューションのいずれかを使用できます。

  1. Scan()を使用する前に、_sql.NullString_を使用してフィールドを処理できます。または
  2. 可能なすべてのNULL値を、クエリ自体の_''_などの目的の文字列で置き換えることができます。

最初のソリューションの実装については、@ RayfenWindspearの回答を参照してください。 2番目のソリューションでは、クエリを次のように更新します。

_SELECT colm1, colm2, COALESCE(photo, '') photo, colm4 FROM Article WHERE photo IS NULL
_

MySQLの場合、IFNULL()またはCOALESCE()関数を使用して、式がNULLの場合に代替値を返します。

SQL Serverの場合、同じ結果を得るにはIFNULL()またはCOALESCE()関数を使用します

MS AccessIsNull関数を使用して同じ結果を得る

Oracleの場合、同じ結果を得るにはNVL()関数を使用します

リファレンス: https://www.w3schools.com/sql/sql_isnull.asp

0
Rahul Satal