Лучшая практика для длинных строковых литералов в 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)

Я думаю, что он выглядит намного чище