2016-05-10 1 views
6

En perl/python Les API DBI disposent d'un mécanisme permettant d'interpoler en toute sécurité les paramètres d'une requête sql. Par exemple, en python que je ferais:Méthode correcte de transmission des paramètres à interroger dans R DBI

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

Lorsque le deuxième paramètre à la méthode d'exécution est un tuple de paramètres à ajouter dans la requête SQL

Y at-il un mécanisme similaire pour les API conformes DBI de R? Les exemples que j'ai vus ne montrent jamais les paramètres passés à la requête. Sinon, quel est le moyen le plus sûr d'interpoler les paramètres d'une requête? Je suis spécifiquement en train d'utiliser RPostgresSQL.

+3

La dernière version de DBI a 'sqlInterpolate' qui en toute sécurité interpoler variables dans une chaîne. – hadley

Répondre

1

En effet l'utilisation de variables de liaison n'est pas vraiment bien documentée. Quoi qu'il en soit, les commandes ODBC dans R fonctionnent différemment pour différentes bases de données. Une possibilité pour postgres serait comme ceci:

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

Hope it helps.

3

Juste pour être complet, j'ajouterai une réponse basée sur le commentaire de Hadley. Le paquet DBI a maintenant la fonction sqlInterpolate qui peut également effectuer cela. Il nécessite une liste d'arguments de fonction à nommer dans la requête sql que tous doivent commencer par un ?. Extrait du DBI manual ci-dessous

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

Qu'est-ce que 'ANSI()' et est-il possible d'interpoler de façon non fiable (par exemple, le nom de la table en tant que paramètre)? – Pranasas

+0

C'est une fonction du paquet DBI, où la documentation dit qu'il s'agit d'un "connecteur DBI factice qui simule la conformité ANSI-SQL". – cts

+1

J'ai également commencé une question concernant l'interpolation peu sûre http://stackoverflow.com/questions/43385119/how-to-use-dynamic-values-while-executing-sql-scripts-in-r – Pranasas