2016-05-10 11 views
6

Trong các API DBL perl/python có một cơ chế để nội suy một cách an toàn trong các tham số cho một truy vấn sql. Ví dụ trong python tôi sẽ làm:Cách thích hợp để chuyển các tham số vào truy vấn trong R DBI

cursor.execute("SELECT * FROM table WHERE value > ?", (5,))  

Trường hợp tham số thứ hai đến phương thức execute là một tuple các thông số để thêm vào truy vấn sql

Có một cơ chế tương tự cho các API phù DBI R không? Các ví dụ tôi đã thấy không bao giờ hiển thị các tham số được truyền cho truy vấn. Nếu không, cách an toàn nhất để nội suy trong các tham số cho một truy vấn là gì? Tôi đang xem xét cụ thể bằng cách sử dụng RPostgresSQL.

+3

Phiên bản mới nhất của DBI có 'sqlInterpolate' sẽ an toàn nội suy biến thành chuỗi. – hadley

Trả lời

1

Thực tế việc sử dụng các biến liên kết không thực sự được ghi nhận. Dù sao các lệnh ODBC trong R hoạt động khác nhau đối với các cơ sở dữ liệu khác nhau. Một khả năng cho postgres sẽ như sau:

res <- postgresqlExecStatement(con, "SELECT * FROM table WHERE value > $1", c(5)) 
postgresqlFetch(res) 
postgresqlCloseResult(res) 

Hy vọng điều đó sẽ hữu ích.

3

Chỉ để hoàn thành, tôi sẽ thêm câu trả lời dựa trên nhận xét của Hadley. Gói DBI hiện có chức năng sqlInterpolate cũng có thể thực hiện điều này. Nó yêu cầu một danh sách các đối số hàm được đặt tên trong truy vấn sql mà tất cả phải bắt đầu bằng một số ?. Trích từ DBI manual bên dưới

sql <- "SELECT * FROM X WHERE name = ?name" 
sqlInterpolate(ANSI(), sql, name = "Hadley") 
# This is safe because the single quote has been double escaped 
sqlInterpolate(ANSI(), sql, name = "H'); DROP TABLE--;") 
+2

'ANSI() 'là gì và có thể nội suy không an toàn (ví dụ, tên bảng như một tham số)? – Pranasas

+0

Đó là một chức năng từ gói DBI, trong đó tài liệu nói rằng đó là "một trình kết nối DBI giả mô phỏng tuân thủ ANSI-SQL". – cts

+1

Tôi cũng đã bắt đầu một câu hỏi về nội suy không an toàn http://stackoverflow.com/questions/43385119/how-to-use-dynamic-values-while-executing-sql-scripts-in-r – Pranasas

Các vấn đề liên quan