Можно ли подготовить оператор SQL один раз для нескольких запросов? - PullRequest
2 голосов
/ 23 сентября 2019

У меня есть несколько SQL-запросов, которые не меняются при каждом запросе (только это параметр).Итак, вместо того, чтобы делать это для каждого запроса:

func HandleRequest() {
    rows, err := db.Query(sqlQuery, params...)
    // do something with data
}

Это нормально, если для каждого запроса я делаю это вместо:

// together with server initialization
stmt, err := db.Prepare(sqlQuery)

func HandleRequest() {
    rows, err := stmt.Query(params...)
    // do something with data
}

1 Ответ

2 голосов
/ 23 сентября 2019

Как указано в документации DB.Prepare():

Несколько запросов или выполнений могут выполняться одновременно из возвращенного оператора.

Itбезопасен для одновременного использования, хотя предназначенное использование для подготовленных операторов не предназначено для совместного использования их между несколькими запросами.Основная причина заключается в том, что подготовленный оператор (может) выделяет ресурсы на самом сервере БД, и он не освобождается до тех пор, пока вы не вызовете метод Close() возвращенного оператора.Поэтому я бы посоветовал против этого.

Типичный вариант использования - это если вам приходится выполнять один и тот же оператор несколько раз с разными параметрами, как, например, в документации:

projects := []struct {
    mascot  string
    release int
}{
    {"tux", 1991},
    {"duke", 1996},
    {"gopher", 2009},
    {"moby dock", 2013},
}

stmt, err := db.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close() // Prepared statements take up server resources and should be closed after use.

for id, project := range projects {
    if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil {
        log.Fatal(err)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...