使用RMySQL查询表字段报错“Unknown column 'c' in 'where clause'”的原因及解决方法
报错原因与修正方案
为什么会报错?
你写的SQL语句里直接用了c、s、a、b这些R变量,但MySQL服务器根本不知道这些变量是什么——它会把这些标识符当成表的列名,而你的表wgEncodeGencodeBasicV27里并没有叫c、s的列,所以就抛出了"Unknown column 'c' in 'where clause'"的错误。
怎么修正?
推荐用参数化查询的方式(更安全,还能避免SQL注入风险),RMySQL支持通过参数绑定的方式将R变量传递给SQL语句,下面是两种常用的修正写法:
方法1:dbSendQuery() + dbBind()分步处理
mydb <- dbConnect(MySQL(), dbname="***", user='***',host='***') a<-29553 b<-31097 c<-'chr1' s<-'+' # 用?作为参数占位符编写SQL模板 res <- dbSendQuery(mydb, "SELECT name FROM wgEncodeGencodeBasicV27 WHERE chrom=? AND strand=? AND txStart=? AND txEnd=?") # 按占位符顺序绑定R变量 dbBind(res, list(c, s, a, b)) # 获取查询结果 result_df <- dbFetch(res) # 记得关闭结果集释放资源 dbClearResult(res)
方法2:dbGetQuery()直接传递参数(更简洁)
mydb <- dbConnect(MySQL(), dbname="***", user='***',host='***') a<-29553 b<-31097 c<-'chr1' s<-'+' # 直接通过params参数传递变量列表 result_df <- dbGetQuery(mydb, "SELECT name FROM wgEncodeGencodeBasicV27 WHERE chrom=? AND strand=? AND txStart=? AND txEnd=?", params = list(c, s, a, b))
不推荐的方法:字符串拼接(存在安全风险)
如果你一定要用字符串拼接的方式,需要把变量的值直接插入到SQL语句中,注意字符串类型的变量要额外加单引号:
mydb <- dbConnect(MySQL(), dbname="***", user='***',host='***') a<-29553 b<-31097 c<-'chr1' s<-'+' # 拼接SQL语句,字符串变量加单引号,数值变量直接拼接 sql_query <- paste0("SELECT name FROM wgEncodeGencodeBasicV27 WHERE chrom='", c, "' AND strand='", s, "' AND txStart=", a, " AND txEnd=", b) res <- dbSendQuery(mydb, sql_query) result_df <- dbFetch(res) dbClearResult(res)
这种方式如果变量内容不可控(比如来自用户输入),很容易引发SQL注入攻击,所以尽量优先使用前面的参数化方法。
内容的提问来源于stack exchange,提问作者Elisa Thouverai
相关产品推荐
相关产品推荐

