2016-10-26 12 views
9

Tôi đang cố chèn dữ liệu vào cơ sở dữ liệu mysql bằng golang. Trong trường hợp giá trị của tôi chiếm một chuỗi rỗng, tôi muốn chèn một giá trị rỗng. Làm thế nào tôi có thể điều chỉnh sau đây để chèn null thay vì chuỗi rỗng? Cảm ơn.Golang Chèn NULL vào sql thay vì chuỗi rỗng

_, 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) 

Trả lời

7

Trong mã của tôi Tôi có một chức năng có thể chuyển đổi một chuỗi để sql.NullString

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

Sau đó, bất cứ khi nào tôi đang sử dụng Exec tôi quấn dây của tôi có thể là NULL trong DB với NewNullString chức năng.

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

Tại sao bạn không làm cho hàm 'NewNullString (..)' trả về 'interface {}', để nếu 's' không phải là một chuỗi rỗng, bạn có thể trả về nó mà không cần gói vào' sql.NullString'? – slomek

+0

@slomek Tôi sẽ thấy nó khó hiểu nếu một hàm có tên 'NewNullString' không trả về một kiểu gọi là NullString. – jmaloney

+0

Tôi sẽ đổi tên chức năng này sau đó, như trở về sth khác hơn là một giá trị thực tế Null có vẻ khó hiểu bây giờ. Đừng đưa tôi sai, đây là sau khi tất cả các câu trả lời đúng, tôi chỉ tự hỏi;) – slomek

7

Gói database/sql có một loại NullString (docs) chỉ tình trạng này.

Về cơ bản, chỉ cần sử dụng sql.NullString thay cho chuỗi nơi bạn muốn chúng không có giá trị bằng db.

Bạn cũng có thể sử dụng *string trong mã của mình để có cùng tác dụng.

Sự cố trong cả hai trường hợp là ánh xạ tới/từ chuỗi rỗng đến chuỗi không thể vô hiệu. Các chuỗi rỗng là về mặt kỹ thuật một giá trị, do đó bạn sẽ hầu như luôn luôn phải làm một cái gì đó như thế này nếu bạn quyết định chuỗi rỗng nên được dịch sang nil:

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

Việc thay thế sẽ chỉ sử dụng *string thay vì string tại của bạn các mô hình trong suốt ứng dụng của bạn.

Trong cơ sở dữ liệu, tôi đã sử dụng phương pháp mà chuỗi rỗng và null là tương đương, và chỉ lưu trữ sting rỗng trong db, và làm cho hầu hết các cột không nullable.

+0

Có cách nào để truyền một chuỗi tới NullString không? – user2694306

+0

đã thêm một số văn bản. – captncraig

Các vấn đề liên quan