web-dev-qa-db-ja.com

Golangは空の文字列の代わりにSQLにNULLを挿入します

Golangを使用してmysqlデータベースにデータを挿入しようとしています。私の値が空の文字列をとる場合、nullを挿入します。空の文字列の代わりにnullを挿入するように、次を調整するにはどうすればよいですか?ありがとう。

_, err := m.Db.Exec(`INSERT INTO 
                         visitor_events
                         (type, 
                          info, 
                          url_path, 
                          visitor_id, 
                          created_at, 
                          domain)
                          VALUES
                          (?, ?, ?, ?, ?, ?)`,
                          m.SaveEventType(ve), ve.EventInfo, m.SaveURLPath(ve.UrlPath), ve.VisitorId, time.Now().UTC(), ve.Domain)
22
user2694306

私のコードには、文字列を sql.NullString

func NewNullString(s string) sql.NullString {
    if len(s) == 0 {
        return sql.NullString{}
    }
    return sql.NullString{
         String: s,
         Valid: true,
    }
}

その後、Execを使用しているときはいつでも、NewNullString関数を使用して、DBでNULLになる可能性のある文字列をラップします。

db.Exec(`
  insert into
      users first_name, last_name, email
      values (?,?,?)`,
  firstName,
  lastName,
  NewNullString(email),
)
32
jmaloney

database/sqlパッケージには、このような状況のためにNullStringタイプ( docs )があります。

基本的に、dbでNULL可能にする文字列の代わりにsql.NullStringを使用します。

コードで*stringを使用して同じ効果を得ることもできます。

どちらの場合でも問題は、null許容文字列とnull許容文字列との間のマッピングにあります。空の文字列は技術的には値であるため、空の文字列をnilに変換する必要があると判断した場合、ほとんど常にこのようなことを行う必要があります。

nullableS := &s
if s == "" {
  nullableS = nil
}

代替案は、アプリ全体のモデルでstringの代わりに*stringを使用することです。

データベースでは、空の文字列とnullは同等で、dbに空の文字列を格納し、ほとんどの列をnull不可にするというアプローチを取っています。

11
captncraig