2

在执行普通 SQL 查询时,Python我已经习惯了总是使用参数替换来编程特定于 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. 我尝试使用dbSendQuery仅接受两个参数的函数来执行此操作:连接处理程序和查询本身。但是我怎样才能提供替换的参数呢?!

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

4

1 回答 1

2

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

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

t <- 'RHAT'
df <- dbGetPreparedQuery(con, sql, bind.data=data.frame(symbol=t))
于 2016-11-22T16:43:34.320 回答