Ruby on rails Ruby-在SQL执行中传递绑定变量

Ruby on rails Ruby-在SQL执行中传递绑定变量,ruby-on-rails,ruby,Ruby On Rails,Ruby,我是Ruby新手,我想尝试访问MySQL数据库: require 'rubygems' require "dbi" class DBConnection attr_accessor :dbh #Connect to db def connect?(driver_url,user,pass) begin @dbh = DBI.connect(driver_url, user,pass); return true rescue DBI::Dat

我是Ruby新手,我想尝试访问MySQL数据库:

require 'rubygems'
require "dbi"

class DBConnection
  attr_accessor :dbh
  #Connect to db 
  def connect?(driver_url,user,pass)
    begin
      @dbh = DBI.connect(driver_url, user,pass);
      return true
    rescue DBI::DatabaseError => e
        puts "Error message: #{e.errstr}"
        @dbh.rollback
        return false
    ensure
      @dbh.disconnect if !dbh
    end
  end

  def execute_customize(query,params)
    stm = @dbh.prepare(query)
    if( (params != nil) && !(params.empty?) )
       stm.execute(params)
    else
      stm.execute
    end
    header = false
    stm.fetch do |row|
      if (!header)
          puts("ID   Name")
          header = true
      end
       puts("#{row[0]}   #{row[1]}")
    end
  end
end

db = DBConnection.new
db.connect?("DBI:Mysql:test:localhost", "root", "123456")
db.execute_customize("SELECT * FROM test.employee WHERE name = ? OR name = ? ",*["John","Terry"])
但上面返回以下错误:

in `execute_customize': wrong number of arguments (3 for 2) (ArgumentError)
但在以下方面执行是成功的:

dbh.execute_customize("SELECT * FROM test.employee WHERE name = ?",*["John"])
我做错了什么

Demo data from employee table :
+------+-------+
| id   | name  |
+------+-------+
|    1 | John  |
|    2 | Terry |
|    3 | Vidal |
|    4 | CR7   |
|    5 | M10   |
|    6 | R10   |
|    7 | F4    |
+------+-------+
//更新:您的评论几乎告诉我在查询中使用,但如果使用其他查询,如:

SELECT * FROM test.employee WHERE name = ? and id > ?

我仍然需要一种方法将单独的参数传递给每个“?”字符

您传递的是三个参数,而不是两个参数

splat操作符
*
扩展数组,因此其元素被视为单独的参数

试一试

其中,
names
是以逗号分隔的字符串列表

这应该可以,但您可能不需要为此使用
execute

如果您使用的是Rails,那么只需使用

Employee.where(name: ["John","Terry"])
ActiveRecord会理解你的意思


请参见

虽然问题是用rails标记的,但他的代码中没有rails特定的内容,您不应该假设他使用的是ActiveRecord。您确定
名称在哪里?
最终会像
名称在哪里('John','Terry')
而不是
名称在'John'
一样吗?谢谢,但我得到了一个mysql语法错误(“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以了解可在“johntery”附近使用的正确语法…”。。。)我想知道为什么我的数组参数包含2个元素,而Ruby将其展平为3个元素??修订版。现在应该使用MySQL:@初学者基本问题仍然是一样的。jmromer是正确的,splat操作符在将数组的组件传递给自定义方法时,具有将数组的组件分离到单个元素的效果。结果就像调用
execute\u customize(查询“John”、“Terry”)
一样,这会给您带来相同的错误。通过执行
execute\u customize(query,*params)
Employee.where(name:['John','Terry'])
什么是
dbh
,可以从方法调用中删除星号,或者更改方法以接受数量可变的
参数?你是怎么创造的?mysql2 gm似乎根本没有执行的
execute
,旧的MySQLGEM的
execute
也不是这样工作的
Employee.where(name: ["John","Terry"])