Đây là các tùy chọn mà tôi biết khi sử dụng RODBC. Tôi biết rằng RSQLite hỗ trợ ràng buộc tham số nguyên bản, nhưng đó là thường không phải là một tùy chọn cho hầu hết mọi người.
# 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)
Tôi giải quyết nhiều truy vấn đóng hộp cho công việc yêu cầu các thông số khác nhau. Vì trong trường hợp của tôi, tôi chỉ có các đặc quyền SELECT
và tôi là người duy nhất đang chạy mã số của mình, tôi thực sự không cần phải lo lắng về việc xác thực.
Vì vậy, về cơ bản, tôi đã đi theo tuyến đường gsub
, để có thể lưu trữ tất cả các truy vấn của tôi trong các tệp .sql riêng biệt theo số . Điều này là do các truy vấn thường dài đủ để giữ chúng trong tệp .R của tôi chỉ trở nên khó sử dụng. Giữ chúng riêng biệt giúp tôi dễ dàng chỉnh sửa và duy trì chúng với định dạng và làm nổi bật rằng phù hợp hơn với SQL.
Vì vậy, tôi đã viết một số hàm nhỏ đọc truy vấn từ tệp .sql và ràng buộc bất kỳ tham số nào. Tôi viết truy vấn có tham số được biểu thị bằng dấu hai chấm, tức là :param1:
, :param2:
.
Sau đó, tôi sử dụng chức năng này để đọc file 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)
}
}
nơi gsub_all
là về cơ bản chỉ là một wrapper cho một vòng lặp for qua các thông số và args
là danh sách tên các giá trị tham số.
Đó là phạm vi tùy chọn mà tôi biết.
Không phải là tôi biết. 'sprintf' là lựa chọn duy nhất khác để' dán' mà tôi biết, nhưng điều đó cũng không làm bất kỳ việc khử trùng nào. – joran
Dường như được đề cập [ở đây] (http://stackoverflow.com/a/1645086/142019) là "trình giữ chỗ" nhưng tôi vẫn không thể tìm thấy cách sử dụng chúng. –
sẽ làm sạch chuỗi trước khi dán nó không thực hiện điều tương tự? –