我知道预处理语句,但如果我使用原始SQL,ActiveRecord是否有方法手动转义值?像这样的东西会很好:
self.escape("O'Malley") # O\'Malley
xv8emn3q1#
您可以执行以下操作:
Dude.connection.quote("O'Malley")
结果:"'O''Malley'"注:从前,你可以做
"'O''Malley'"
Dude.sanitize("O'Malley")
但那是deprecated,而目前的方法
Dude.sanitize_sql("O'Malley")
也不能省略撇号
5anewei62#
快速浏览ActiveRecord源代码,可以发现它的方法“sanitize_sql_array”用于清理[string, bind_variable[, bind_variable]]类型的sql语句你可以直接调用它:
[string, bind_variable[, bind_variable]]
sql = ActiveRecord::Base.send(:sanitize_sql_array, ["insert into foo (bar, baz) values (?, ?), (?, ?)", 'a', 'b', 'c', 'd']) res = ActiveRecord::Base.connection.execute(sql)
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")
这样就行了。
pobjuy324#
如果你不想在使用@konus发布的解决方案时出现额外的单引号,你可以这样做:
Dude.connection.quote_string("O'Malley")
这将返回"O\'Malley"而不是"'O\'Malley'"
"O\'Malley"
"'O\'Malley'"
bvpmtnay5#
即使使用Model.find_by_sql,您仍然可以使用问号作为转义值的形式。只需传递一个数组,其中第一个元素是查询,后续元素是要替换的值。Rails API文档中的示例:
Model.find_by_sql
Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
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方法的引用,它通过转义字符串中的单引号来生成正确的查询字符串。例如,妙语“不要让他们让你失望”将成为“不要让他们让你失望”。
6条答案
按热度按时间xv8emn3q1#
您可以执行以下操作:
结果:
"'O''Malley'"
注:从前,你可以做
但那是deprecated,而目前的方法
也不能省略撇号
5anewei62#
快速浏览ActiveRecord源代码,可以发现它的方法“sanitize_sql_array”用于清理
[string, bind_variable[, bind_variable]]
类型的sql语句你可以直接调用它:
dzjeubhm3#
你可以使用mysql2 gem来实现:
或者如果使用早期的mysql(不是mysql2)gem:
这将允许你转义任何你想要的东西,然后插入到数据库。你也可以使用sanitize方法在你的rails应用程序中的大多数模型上实现这一点。例如,假设您有一个名为Person的模型。你可以做。
这样就行了。
pobjuy324#
如果你不想在使用@konus发布的解决方案时出现额外的单引号,你可以这样做:
这将返回
"O\'Malley"
而不是"'O\'Malley'"
bvpmtnay5#
即使使用
Model.find_by_sql
,您仍然可以使用问号作为转义值的形式。只需传递一个数组,其中第一个元素是查询,后续元素是要替换的值。
Rails API文档中的示例:
cyvaqqii6#
如果有人正在寻找@jemminger的解决方案的更具体的例子,这里是批量插入:
下面是对ActiveRecord::Base中sanitize_sql_array方法的引用,它通过转义字符串中的单引号来生成正确的查询字符串。例如,妙语“不要让他们让你失望”将成为“不要让他们让你失望”。