如何使用 R 在 SQL 查询中执行参数替换? [复制]
Posted
技术标签:
【中文标题】如何使用 R 在 SQL 查询中执行参数替换? [复制]【英文标题】:How to perform parameter substitution in SQL queries using R? [duplicate] 【发布时间】:2016-11-22 16:08:56 【问题描述】:在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
文档中写道:
Never、never、NEVER 使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。甚至在枪口下也没有。
现在我必须将来自R
的数据保存到 SQLite 数据库中。我尝试使用仅接受两个参数的函数dbSendQuery
来执行此操作:连接处理程序和查询本身。但是如何提供替换的参数呢?!
谷歌搜索我发现(令人惊讶!)在 R 社区中,人们总是建议使用 paste
构建 SQL 查询,然后将其提供给 dbSendQuery
。但是安全和优雅呢?好像没人在乎……我个人不明白。
【问题讨论】:
您在使用 SQLite 时为什么要阅读psycopg2
文档,这是一个 Postgres API?
Parameterized queries with RODBC 的可能重复项。另见How to write parameterized sql query in R programming using Rstudio IDE
我不知道paste
命令代表安全问题...
@cory google “鲍比桌”。
@HongOoi 对,我知道什么是 SQL 注入。在 R 世界中,这通常不是什么大问题,因为 SQL 查询通常不是由随机的公众成员以交互方式完成的,它们是在您自己的本地脚本中完成的。所以这个问题应该问如何清理 sql 查询中的输入,或者一些不会让人觉得这家伙在抨击 R 用户粗心和不雅的东西。
【参考方案1】:
使用 RSQLite,您可以使用 dbGetPreparedQuery
进行参数化查询(即将值绑定到准备好的语句)。见docs。但是,您必须将绑定的值作为数据框对象传递:
sql <- "SELECT * FROM stocks WHERE symbol=?"
t <- 'RHAT'
df <- dbGetPreparedQuery(con, sql, bind.data=data.frame(symbol=t))
【讨论】:
哦,谢谢@Parfait,这正是我想要的!我知道这个文档,我实际上使用搜索找到了里面的“参数”这个词,但是他们称这个过程为“SQL准备”,所以我没有找到它。以上是关于如何使用 R 在 SQL 查询中执行参数替换? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]
在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]