ruby-on-rails Rails中的转义值(类似于mysql_真实的_escape_string())

wfauudbj  于 2023-10-21  发布在  Ruby
关注(0)|答案(6)|浏览(116)

我知道预处理语句,但如果我使用原始SQL,ActiveRecord是否有方法手动转义值?
像这样的东西会很好:

self.escape("O'Malley") # O\'Malley
xv8emn3q

xv8emn3q1#

您可以执行以下操作:

Dude.connection.quote("O'Malley")

结果:"'O''Malley'"
注:从前,你可以做

Dude.sanitize("O'Malley")

但那是deprecated,而目前的方法

Dude.sanitize_sql("O'Malley")

也不能省略撇号

5anewei6

5anewei62#

快速浏览ActiveRecord源代码,可以发现它的方法“sanitize_sql_array”用于清理[string, bind_variable[, bind_variable]]类型的sql语句
你可以直接调用它:

sql = ActiveRecord::Base.send(:sanitize_sql_array, ["insert into foo (bar, baz) values (?, ?), (?, ?)", 'a', 'b', 'c', 'd'])
res = ActiveRecord::Base.connection.execute(sql)
dzjeubhm

dzjeubhm3#

你可以使用mysql2 gem来实现:

irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'mysql2'
=> true
irb(main):004:0> Mysql2::Client.escape("O'Malley") # => "O\\'Malley"
=> "O\\'Malley"

或者如果使用早期的mysql(不是mysql2)gem:

irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'mysql'
=> true
irb(main):004:0> Mysql.escape_string("O'Malley")
=> "O\\'Malley"

这将允许你转义任何你想要的东西,然后插入到数据库。你也可以使用sanitize方法在你的rails应用程序中的大多数模型上实现这一点。例如,假设您有一个名为Person的模型。你可以做。

Person.sanitize("O'Malley")

这样就行了。

pobjuy32

pobjuy324#

如果你不想在使用@konus发布的解决方案时出现额外的单引号,你可以这样做:

Dude.connection.quote_string("O'Malley")

这将返回"O\'Malley"而不是"'O\'Malley'"

bvpmtnay

bvpmtnay5#

即使使用Model.find_by_sql,您仍然可以使用问号作为转义值的形式。
只需传递一个数组,其中第一个元素是查询,后续元素是要替换的值。
Rails API文档中的示例:

Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
cyvaqqii

cyvaqqii6#

如果有人正在寻找@jemminger的解决方案的更具体的例子,这里是批量插入:

users_places = []
users_values = []
timestamp = Time.now.strftime('%Y-%m-%d %H:%M:%S')
params[:users].each do |user|
    users_places "(?,?,?,?)"
    users_values << user[:name] << user[:punch_line] << timestamp << timestamp
end

bulk_insert_users_sql_arr = ["INSERT INTO users (name, punch_line, created_at, updated_at) VALUES #{users_places.join(", ")}"] + users_values
begin
    sql = ActiveRecord::Base.send(:sanitize_sql_array, bulk_insert_users_sql_arr)
    ActiveRecord::Base.connection.execute(sql)
rescue
    "something went wrong with the bulk insert sql query"
end

下面是对ActiveRecord::Base中sanitize_sql_array方法的引用,它通过转义字符串中的单引号来生成正确的查询字符串。例如,妙语“不要让他们让你失望”将成为“不要让他们让你失望”。

相关问题