如何使用R在SQL查询中执行参数替换?

时间:2016-11-22 16:08:56

标签: r rsqlite

Python中编写特定于SQL的东西我已经习惯了总是在执行纯SQL查询时使用参数替换,如下所示:

# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)

psycopg2文档中,他们甚至写道:

  

从不,从不从不使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串。甚至在枪口下也没有。

现在我必须将数据从R保存到SQLite数据库中。我尝试使用仅接受两个参数的函数dbSendQuery来执行此操作:连接处理程序和查询本身。但是我怎样才能提供替代参数?!

谷歌搜索我发现(令人惊讶的是!)在R社区中,人们总是建议使用paste构建SQL查询,然后将其提供给dbSendQuery。但安全和优雅呢?似乎没有人关心......我个人不明白这一点。

1 个答案:

答案 0 :(得分:2)

使用RSQLite,您可以将dbGetPreparedQuery用于参数化查询(即,将值绑定到预准备语句)。见docs。但是,您必须将绑定值作为数据框对象传递:

sql <- "SELECT * FROM stocks WHERE symbol=?"

t <- 'RHAT'
df <- dbGetPreparedQuery(con, sql, bind.data=data.frame(symbol=t))