在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
。但安全和优雅呢?似乎没有人关心......我个人不明白这一点。
答案 0 :(得分:2)
使用RSQLite,您可以将dbGetPreparedQuery
用于参数化查询(即,将值绑定到预准备语句)。见docs。但是,您必须将绑定值作为数据框对象传递:
sql <- "SELECT * FROM stocks WHERE symbol=?"
t <- 'RHAT'
df <- dbGetPreparedQuery(con, sql, bind.data=data.frame(symbol=t))