Query parametrizzate con RODBC

Ho una variabile in R che vorrei passare ad un database. Potrei usare paste come molti suggeriscono durante la lettura dei risultati di Google, ma questo è pericoloso a causa delle vulnerabilità di SQL injection. Preferirei preferire qualcosa del genere:

 x  ?;', bind=c(x)) 

È ansible utilizzare query parametrizzate con RODBC? In caso contrario, esiste una libreria alternativa che li supporta?

Sto usando SQL Server, RODBC 1.3-6 e R 3.0.0.

Mateusz Zoltak ha scritto il pacchetto RODBCext nel 2014 (basato sul lavoro di Brian Ripley e Michael Lapsley):

 conn = odbcConnect('MyDataSource') sqlPrepare(conn, "SELECT * FROM myTable WHERE column = ?") sqlExecute(conn, 'myValue') sqlFetchMore(conn) 

Fonte: http://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html

Queste sono le opzioni che conosco dell’utilizzo di RODBC. So che RSQLite supporta il binding di parametri in modo nativo, ma di solito non è un’opzione per la maggior parte delle persone.

 # 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) 

Ho a che fare con un sacco di domande in scatola per il mio lavoro che richiedono vari parametri. Dal momento che nel mio caso ho solo i privilegi SELECT e sono l’unica persona che esegue il mio codice, non ho davvero bisogno di preoccuparmi della convalida.

Quindi ho praticamente fatto il percorso di gsub , per poter memorizzare tutte le mie query in file separati .sql. Questo perché le query sono spesso abbastanza lunghe da impedirne la conservazione nei miei file .R. Tenendoli separati, è più facile per me modificarli e mantenerli con la formattazione e l’evidenziazione che è più appropriata per SQL.

Così ho scritto alcune piccole funzioni che leggono una query da un file .sql e legano tutti i parametri. Scrivo la query con parametri denotati con due punti, ovvero :param1: , :param2:

Quindi uso questa funzione per leggere il 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) } } 

dove gsub_all è fondamentalmente solo un wrapper per un ciclo for sui parametri e args è un elenco con nome di valori di parametro.

Questa è la gamma di opzioni di cui sono a conoscenza.