2016-10-26 28 views
9

golangを使用してmysqlデータベースにデータを挿入しようとしています。私の値が空の文字列を取る場合、nullを挿入したいと思います。空の文字列ではなくヌルを挿入するには、次のように調整するにはどうすればよいですか?ありがとう。Golang空文字列の代わりに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) 

答えて

7

は、私は私がNewNullString機能でDBにNULL可能性があり、私の文字列をラップExecを使用していますそして、いつでもsql.NullString

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

に文字列を変換する関数を持っています。

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

'NewNullString(..)'関数が 'interface {}'を返さないようにして、 's'が空文字列でなければ' sql.NullString'にラップせずに返すことができますか? – slomek

+0

@slomek 'NewNullString'という名前の関数がNullStringと呼ばれる型を返さなかった場合、混乱することがあります。 – jmaloney

+0

この関数の名前を変更すると、実際のNull値以外のsthを返すと混乱するようです。私は間違っていない、これはすべての正解の後、私は思っているだけです;) – slomek

7

database/sqlパッケージは、まさにこのような状況のためNullStringタイプ(docs)を持っています。

基本的には、文字列の代わりにsql.NullStringを使用して、dbでNULL値を使用できるようにします。

コード内で*stringを使用しても同じ効果が得られます。

どちらの場合でも問題は、null可能な文字列との間のマッピングであり、null不可能な文字列へのマッピングです。あなたは、ほとんどの場合、あなたは空の文字列がnilに変換する必要があるかを決定する場合は、このような何かを行う必要がありますので、空の文字列が、技術的に価値ある:

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

代替は自分で*string代わりのstringを使用することですあなたのアプリ全体のモデル。

データベースでは、空の文字列とnullが等価で、dbに空白を格納し、ほとんどの列をnullにできないようにしています。私のコードで

+0

NullStringに文字列をキャストする方法はありますか? – user2694306

+0

がテキストを追加しました。 – captncraig

関連する問題