如何使用R在SQL查询中执行参数替换?
在如何使用R在SQL查询中执行参数替换?,r,rsqlite,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) 他们甚至在
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
。但是安全和优雅呢?好像没人在乎。。。我个人不理解这一点。对于RSQLite,您可以使用dbGetPreparedQuery
进行参数化查询(即,将值绑定到准备好的语句)。看见但是,必须将绑定值作为dataframe对象传递:
sql <- "SELECT * FROM stocks WHERE symbol=?"
t <- 'RHAT'
df <- dbGetPreparedQuery(con, sql, bind.data=data.frame(symbol=t))
sql为什么在使用SQLite时要阅读作为Postgres API的psycopg2
docs?可能存在重复。另请参见,我不知道粘贴
命令代表了安全问题…@cory google“Bobby Tables”。@HongOoi对,我知道什么是SQL注入。在R世界中,这通常不是什么大问题,因为SQL查询通常不是由随机的公众成员交互完成的,而是在本地运行的脚本中完成的。因此,问题应该是如何清理sql查询中的输入,或者如何避免这家伙指责R用户粗心大意和不雅。哦,谢谢@Parfait,这正是我想要的!我知道这个文档,实际上我使用搜索来查找里面的单词“parameter”,但是他们称这个过程为“SQL准备”,所以我没有找到它。