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)
私のコードには、文字列を 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),
)
database/sql
パッケージには、このような状況のためにNullString
タイプ( docs )があります。
基本的に、dbでNULL可能にする文字列の代わりにsql.NullString
を使用します。
コードで*string
を使用して同じ効果を得ることもできます。
どちらの場合でも問題は、null許容文字列とnull許容文字列との間のマッピングにあります。空の文字列は技術的には値であるため、空の文字列をnilに変換する必要があると判断した場合、ほとんど常にこのようなことを行う必要があります。
nullableS := &s
if s == "" {
nullableS = nil
}
代替案は、アプリ全体のモデルでstring
の代わりに*string
を使用することです。
データベースでは、空の文字列とnullは同等で、dbに空の文字列を格納し、ほとんどの列をnull不可にするというアプローチを取っています。