2017-04-13 2 views
2

Mon flux de travail R implique désormais de traiter un grand nombre de requêtes (bibliothèque RPostgreSQL). Je veux vraiment rendre le code facile à maintenir et à gérer dans le futur.Comment utiliser des valeurs dynamiques lors de l'exécution de scripts SQL dans R

J'ai commencé à charger de grandes requêtes à partir de fichiers distincts .SQL (this aidé) et cela a très bien fonctionné.

Ensuite, je commencé à utiliser des valeurs interpolées (that aidé) ce qui signifie que je peux écrire

SELECT * FROM table WHERE value = ?my_value; 

et (après le chargement dans R) interpoler en utilisant sqlInterpolate(ANSI(), query, value = "stackoverflow").

Qu'est-ce qui se passe maintenant je veux utiliser quelque chose comme ça

SELECT count(*) FROM ?my_table; 

mais comment puis-je le faire fonctionner? sqlInterpolate() interpole uniquement en toute sécurité par défaut. Y at-il un travail autour?

Merci

Répondre

0

sqlInterpolate() est pour substituer des valeurs, et non d'autres composants comme les noms de table. Vous pouvez utiliser d'autres structures de modèle telles que brew ou whisker.

0

En ?DBI::SQL, vous pouvez lire:

Par défaut, tout utilisateur fourni entrée à une requête doit être échappé à l'aide soit dbQuoteIdentifier() ou dbQuoteString() selon qu'il fait référence à une table ou nom de variable, ou est une chaîne littérale.

En outre, sur this page:

Vous pouvez aussi avoir besoin dbQuoteIdentifier() si vous créez des tables ou sur l'entrée reposant utilisateur de choisir la colonne à filtrer.

, vous pouvez utiliser:

sqlInterpolate(ANSI(), 
       "SELECT count(*) FROM ?my_table", 
       my_table = dbQuoteIdentifier(ANSI(), "table_name")) 
# <SQL> SELECT count(*) FROM "table_name"