如何在Ruby的SQL查询中使用LIKE?查询起始字符时出错
在Ruby的SQL查询中正确使用LIKE操作符
问题根源:你直接通过字符串插值拼接SQL语句,不仅存在SQL注入风险,还可能因变量中的特殊字符(比如单引号)触发语法错误,这就是你当前出错的原因。
正确方案:使用参数化查询
所有主流Ruby数据库库都支持参数化查询,通过占位符传递参数,由数据库自动处理转义和拼接逻辑,既安全又能避免语法问题。以下是不同库的实现示例:ActiveRecord(Rails常用)
利用where方法结合占位符构建查询:results = SapSid.joins(instance: :vm) .where("sap_sid.name LIKE ? AND sap_vm.customer_id = ?", "#{tipo}%", cliente_id) .pluck(:sid) results.each do |item| # 你的处理逻辑 end更简洁的写法:
results = SapSid.joins(instance: :vm) .where("sap_sid.name LIKE :prefix", prefix: "#{tipo}%") .where(sap_vm: { customer_id: cliente_id }) .pluck(:sid)PG gem(原生PostgreSQL连接)
使用$1、$2作为占位符:conn = PG.connect(dbname: '你的数据库名称') query = <<~SQL SELECT sid.sid FROM sap_vm vm INNER JOIN sap_instance instance ON vm.id = instance.vm_id INNER JOIN sap_sid sid ON sid.id = instance.sid_id WHERE sid.name LIKE $1 AND vm.customer_id = $2 SQL conn.exec_params(query, ["#{tipo}%", cliente_id]).each do |item| # 你的处理逻辑 endmysql2 gem(原生MySQL连接)
使用?作为占位符:client = Mysql2::Client.new(host: 'localhost', username: '用户名', database: '你的数据库名称') query = <<~SQL SELECT sid.sid FROM sap_vm vm INNER JOIN sap_instance instance ON vm.id = instance.vm_id INNER JOIN sap_sid sid ON sid.id = instance.sid_id WHERE sid.name LIKE ? AND vm.customer_id = ? SQL client.query(query, ["#{tipo}%", cliente_id]).each do |item| # 你的处理逻辑 end
避免直接拼接字符串的原因
- 存在SQL注入风险:恶意用户可构造变量值执行任意SQL,破坏数据或窃取信息。
- 易触发语法错误:当变量包含单引号等特殊字符时,拼接后的SQL会直接失效,比如
tipo值为D'EV时,会生成LIKE 'D'EV%'的错误语句。
内容的提问来源于stack exchange,提问作者miguel lara
相关产品推荐
相关产品推荐

