【问题标题】:quote value manually before passing to database在传递到数据库之前手动引用值
【发布时间】:2014-07-27 20:24:40
【问题描述】:

当涉及到WHERE 子句时,一切都清楚了:

puts $DB[:users].where('field = ?', "'").sql   # SELECT * FROM `users` WHERE (field = '\'')
puts $DB[:users].where(field: "'").sql   # SELECT * FROM `users` WHERE (`field` = '\'')

但是ORDER BY 的呢?

puts $DB[:users].order_by(
    ("field = '%s'" % "'").lit
).sql   # SELECT * FROM `users` ORDER BY field = '''

【问题讨论】:

  • 我帮不了你,但我很好奇,我从来没有见过像这样的值的ORDER BY,这到底是什么意思?
  • 考虑一个包含用户列表的页面。我希望它们显示如下:首先来自我镇的用户,然后来自我的国家,然后是其他任何人。一种方法是:SELECT * FROM users ORDER BY town == '<my town>' DESC, country == '<my country>' DESC

标签: ruby escaping sinatra sequel quoting


【解决方案1】:

您可以quote 清理您的字符串:

puts $DB[:users].order_by(
    ("field = %s" % ActiveRecord::Base.connection.quote("'")).lit
).sql    # SELECT * FROM `users` ORDER BY field = ''''

对于sequel,您应该使用literal_append

puts $DB[:users].order_by(
    ($DB[:users].literal_append("field = ", "'")).lit
).sql    # SELECT * FROM `users` ORDER BY field = ''''

【讨论】:

  • 是的,我正在寻找类似的东西,但我不使用rails,我使用的是sinatra
  • 那不是rails - 这是active-record...我看看能不能在sequel找到对应的
  • 还有literal方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2015-11-14
相关资源
最近更新 更多