Это опции, которые я знаю об использовании RODBC. Я знаю , что RSQLite поддерживает привязку параметров изначально, но это обычно не является вариантом для большинства людей.
# Note that sprintf doesn't quote character values. The quotes need
# to be already in the sql, or you have to add them yourself to the
# parameter using paste().
q <- "select * from table where val1 = '%s' and val2 < %d and val3 >= %f"
sprintf(q,"Hey!",10,3.141)
# The gsub route means you can't easily use a single placeholder
# value.
q <- "select * from table where val1 = '?' and val2 < ? and val3 >= ?"
gsub("?","Value!",q,fixed = TRUE)
Я имею дело с большим количеством консервированных запросов для моей работы, которые требуют различных параметров. Поскольку в моем случае у меня есть только SELECT
привилегий, и я являюсь только человеком, который запускает мой код, мне действительно не нужно беспокоиться о проверке.
Итак, у меня в основном ушел маршрут gsub
, чтобы иметь возможность хранить все мои запросы в отдельных файлах .sql. Это связано с тем, что запросы часто длинны , что их хранение в моих файлах .R просто становится громоздким. Сохранение их в отдельности упрощает редактирование и поддержку с форматированием и подчеркиванием того, что подходит для SQL.
Итак, я написал несколько небольших функций, которые читают запрос из .sql-файла и связывают любые параметры. Я пишу запрос с параметрами, обозначенными двоеточиями, i.e. :param1:
, :param2:
.
Затем я использую эту функцию, чтобы прочитать файл .sql:
function (path, args = NULL)
{
stopifnot(file.exists(path))
if (length(args) > 0) {
stopifnot(all(names(args) != ""))
sql <- readChar(path, nchar = file.info(path)$size)
p <- paste0(":", names(args), ":")
sql <- gsub_all(pattern = p, replacement = args, x = sql)
return(sql)
} else {
sql <- readChar(path, nchar = file.info(path)$size)
return(sql)
}
}
где gsub_all
в основном только обертка для для цикла над параметрами и args
является именованным списком значений параметров.
Это диапазон опций, о которых я знаю.
Не то, что я знаю. 'sprintf' является единственным другим вариантом для« вставки », который я знаю, но это тоже не делает никакой санировки. – joran
Как упоминается [здесь] (http://stackoverflow.com/a/1645086/142019) как «заполнители», но я все еще не мог найти, как их использовать. – 2013-04-23 20:46:08
очистил бы строку перед тем, как вставить ее, не выполнит то же самое? –