Bạn không thể sử dụng trình giữ chỗ cho số nhận dạng (chẳng hạn như tên bảng và cột), trình giữ chỗ dành cho giá trị . Bạn có thể coi số nhận dạng tương tự như tên biến hoặc tên hàm trong Go, vì vậy việc có thể sử dụng trình giữ chỗ cho số nhận dạng sẽ giống như việc có eval
như trong các ngôn ngữ kịch bản khác nhau.
Điều này giúp bạn giảm bớt việc sử dụng fmt.Sprintf
và các hoạt động chuỗi tương tự để xây dựng SQL khi bạn không biết số nhận dạng cho đến thời gian chạy:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
nhưng điều này mở ra cho bạn các vấn đề về chèn và trích dẫn SQL, vì vậy bạn muốn có một số loại danh sách trắng:
quotedColumns := map[string]string{
"firstName": "`firstName`",
"lastName": "`lastName`",
...
}
quoted, ok := quotedColumns[columnName]
if !ok {
// Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)
Lưu ý rằng tôi đã bao gồm trích dẫn backtick của MySQL trong các giá trị của bản đồ. Không có gì trong giao diện chuẩn để trích dẫn / thoát mã định danh nên bạn phải tự làm. Nếu bạn đã viết bản đồ danh sách trắng bằng tay thì bạn cũng có thể đưa vào phần trích dẫn bằng tay; nếu không, bạn có thể viết hàm trích dẫn của riêng mình cho các số nhận dạng bằng cách đọc tài liệu MySQL về trích dẫn và thực hiện một vài thao tác chuỗi đơn giản (hy vọng).