Лучшая практика для длинных строковых литералов в Go
У меня есть длинный строковый литерал в Go:
db.Exec("UPDATE mytable SET (I, Have, Lots, Of, Fields) = ('suchalongvalue', 'thisislongaswell', 'ohmansolong', 'wowsolong', 'loooooooooooooooooooooooooong')")
Я вижу два способа сделать это более управляемым: исходные кавычки или несколько конкатенированных котировок:
db.Exec(`UPDATE mytable SET (I, Have, Lots, Of, Fields)
= ('suchalongvalue', 'thisislongaswell', 'ohmansolong',
'wowsolong', 'loooooooooooooooooooooooooong')`)
db.Exec("UPDATE mytable SET (I, Have, Lots, Of, Fields) = " +
"('suchalongvalue', 'thisislongaswell', 'ohmansolong', " +
"'wowsolong', 'loooooooooooooooooooooooooong')")
Первое кажется более правильным, но предыдущие пробелы будут включены в строку, что приведет к тому, что результирующая строка будет иметь неудобные пробелы в ней. Является ли любой из этих рассмотренных идиоматических Go?
Ответы
Ответ 1
Похоже, странно вставлять длинный строковый литерал в такой параметр. Я бы предпочел:
const updateQuery=`
UPDATE mytable SET (I, Have, Lots, Of, Fields)
= ('suchalongvalue', 'thisislongaswell', 'ohmansolong',
'wowsolong', 'loooooooooooooooooooooooooong')`
func doUpdate(){
db.Exec(updateQuery)
}
Я также предпочитаю одну новую строку в начале для нечетных пробелов в каждой строке. Таким образом вы можете убить его с помощью strings.Trim
, если это вызывает проблемы.
Ответ 2
Так как мы говорим о SQL в этом экземпляре...
Редко передавать строковые литералы в виде значений столбцов в INSERT
или UPDATE
. Вы почти всегда будете передавать вычисляемые значения из кода, и в этом случае гораздо лучше использовать параметризованные запросы. В редком случае, когда вы знаете значение во время компиляции, параметризация по-прежнему в целом является правильным ответом:
_, err := db.Exec(
`UPDATE mytable SET (I, Have, Lots, Of, Fields) = ($1, $2, $3, $4, $5)`,
"suchalongvalue",
"thisislongaswell",
"ohmansolong",
"wowsolong",
"loooooooooooooooooooooooooong")
Ответ 3
Вы можете сделать:
s := `UPDATE mytable SET (I, Have, Lots, Of, Fields) = `
s += `('suchalongvalue', `
s += `'thisislongaswell', `
s += `'wowsolong', `
s += `loooooooooooooooooooooooooong')`
db.Exec(s)
Ответ 4
Это то, что я делаю:
q := `UPDATE mytable SET (I, Have, Lots, Of, Fields) = ` +
`('suchalongvalue', ` +
`'thisislongaswell', ` +
`'wowsolong', ` +
`loooooooooooooooooooooooooong')`
db.Exec(q)
Я думаю, что он выглядит намного чище