Я формализую свой комментарий в ответ.
"Привязка" не изменяет запрос, она просто "увеличивает" запрос с объектами, которые рассматривают только как данные, недостаток, смешиваемый с кодом.
последнее смешивание может быть проблематичным по нескольким причинам:
Злорадный код, развертывающий "Внедрение SQL" ( https://xkcd.com/327 / , и объяснение Wiki ). Короче говоря, это использует в своих интересах закрытие заключенной в кавычки строки или литерала и выполнения кода SQL непосредственно, возможно, чтобы удалить или изменить данные, возможно, извлечь данные.
Невинно достаточно, если "данные" Вы добавляете к запросу, содержит кавычки, которых не оставляют правильно, Вы могли непреднамеренно выполнить свое собственное Внедрение SQL, хотя, возможно, менее вероятно сделать как "Плохие Вещи", как № 1 сделает.
Оптимизация кода SQL. Большинство систем управления базами данных проанализирует и оптимизирует SQL-запрос так, чтобы он работал лучше, использует в своих интересах ключи, и т.д. Они часто помнят запросы, так, чтобы повторный запрос не должен был быть повторно проанализирован, экономя время. При смешивании данных/параметров в с необработанным текстом SQL-запроса то при изменении одной вещи об этом (даже всего одна цифра в параметре) DBMS должен будет, вероятно, повторно проанализировать запрос. Неэффективный.
существуют функции, которые упрощают выход или заключение в кавычки литералов и строк, и если Вы чувствуете, что необходимо поместить литералы в SQL-запрос, затем я убеждаю Вас использовать их. Они включают (но не ограничены) DBI::dbQuoteString
, DBI::dbQuoteLiteral
, и DBI::dbQuoteIdentifier
.
Другая такая функция glue::glue_sql
, который обрабатывает корректное заключение в кавычки/выход литералов, и идентификаторы, к [1 111] "делают [s], создающий SQL-операторы безопасный и легкий" (заключенный в кавычки из github repo). Это - "просто" строковая интерполяция, поэтому в то время как она должна защитить Вас очень хорошо от № 1 и № 2 выше, она не обязательно разрешает/поощряет № 3.
(Она только берет неверную цитату того для напоминания Вам, который используется где для Вашего конкретного DBMS.)
Для записи, привязка довольно проста, как предусмотрено в ее документации:
iris_result <- dbSendQuery(con, "SELECT * FROM iris WHERE [Petal.Width] > ?")
dbBind(iris_result, list(2.3))
results <- dbFetch(iris_result)
, Если Вы хотите, Вы можете снова использовать тот же res
(по крайней мере, в некоторых системах управления базами данных, не протестированных на всех), как в [1 127]
# same iris_result as above
dbBind(iris_result, list(2.5))
dbFetch(iris_result)
dbBind(iris_result, list(3))
dbFetch(iris_result)
dbBind(iris_result, list(3.2))
dbFetch(iris_result)
Так много раз, как Вам нужно, в конечном счете заканчивая с [1 128]
DBI::dbClearResult(iris_result)
К сожалению, необходимо будет настроить боб пружины источника данных для себя, если Вы захотите получить больше контроля над ним. Это может быть сделано путем определения боба в "grails-app/conf/spring/resources.groovy"
beans = {
dataSource(org.apache.commons.dbcp.BasicDataSource) {
driverClassName = "com.mysql.jdbc.Driver"
username = "someuser"
password = "s3cret"
initialSize = 15
maxActive = 50
maxIdle = 15
}
}
Это переопределит Grails DataSource по умолчанию, который настроен в "grails-app/conf/DataSource.groovy".
Вероятно, это должно также работать для переопределения свойств размера пула чаш Грааля по умолчанию конфигурация DataSource.groovy как это усиление PropertyOverrideConfigurer (в Config.groovy):
beans = {
dataSource.initialSize = 15
dataSource.maxActive = 50
dataSource.maxIdle = 15
}
Для grails 1.2 вы должны использовать немного другой формат:
dataSource {
pooled = true
dbCreate = "update"
url = "jdbc:mysql://localhost/yourDB"
driverClassName = "com.mysql.jdbc.Driver"
username = "yourUser"
password = "yourPassword"
properties {
maxActive = 50
maxIdle = 25
minIdle = 5
initialSize = 5
minEvictableIdleTimeMillis = 60000
timeBetweenEvictionRunsMillis = 60000
maxWait = 10000
}
}