2016-05-10 11 views
6

In Perl/Python le API DBI dispongono di un meccanismo per l'interpolazione sicura nei parametri di una query sql. Per esempio in python che vorrei fare:Modo corretto per passare i parametri alla query in D DBI

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

Dove il secondo parametro al metodo execute è una tupla di parametri da aggiungere nella query SQL

Esiste un meccanismo simile per le API compatibili DBI di R? Gli esempi che ho visto non mostrano mai i parametri passati alla query. In caso contrario, qual è il modo più sicuro per interpolare nei parametri di una query? Sto specificatamente cercando di usare RPostgresSQL.

+3

L'ultima versione di DBI ha 'sqlInterpolate' che in modo sicuro interpolare variabili in una stringa. – hadley

risposta

1

In effetti l'uso delle variabili di bind non è molto ben documentato. Ad ogni modo i comandi ODBC in R funzionano in modo diverso per diversi database. Una possibilità per postgres sarebbe come questo:

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

Speranza che aiuta.

3

Solo per completezza, aggiungerò una risposta basata sul commento di Hadley. Il pacchetto DBI ora ha la funzione sqlInterpolate che può anche funzionare. Richiede un elenco di argomenti di funzione da denominare nella query sql che tutti devono iniziare con un ?. Estratto dal DBI manual sotto

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

Che cos'è 'ANSI()' ed è possibile interpolare in modo non sicuro (ad esempio, il nome della tabella come parametro)? – Pranasas

+0

È una funzione del pacchetto DBI, in cui la documentazione dice che è "un connettore DBI fittizio che simula la conformità ANSI-SQL". – cts

+1

Ho anche iniziato una domanda riguardante l'interpolazione non sicura http://stackoverflow.com/questions/43385119/how-to-use-dynamic-values-while-executing-sql-scripts-in-r – Pranasas