Ruby on rails Ruby-在SQL执行中传递绑定变量
我是Ruby新手,我想尝试访问MySQL数据库: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
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"])