【问题标题】:How to run raw SQL queries with Sequel如何使用 Sequel 运行原始 SQL 查询
【发布时间】:2010-06-29 21:15:52
【问题描述】:

我还不清楚使用 Sequel 运行原始 SQL 查询的正确方法。

目前我正在尝试这个:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row|
 @zonename = row
end

我怎样才能将查询作为原始 SQL 运行,然后像平常一样访问结果?

if @zonename.name = "UK"

【问题讨论】:

    标签: sql ruby sequel


    【解决方案1】:

    请注意,而不是:

    DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1")
    

    你应该这样做:

    DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode)
    

    否则,如果你不控制@dialcode的内容,你就会打开自己的SQL注入。

    【讨论】:

    • 您能告诉我fetch 在后台调用了什么方法来逃​​避用户输入吗?我有一个由许多方法构建的复杂查询,在构建查询时需要将用户输入与我的数据库调用分开转义。
    • 抱歉,刚刚在文档中找到它(我在搜索此内容时正在阅读,将在此处发布给其他人):github.com/jeremyevans/sequel/blob/…。方法是DB.literal(my_insecure_string)。感谢 Jeremy 的图书馆。
    【解决方案2】:

    我有一些可能有用的建议:

    1. 你可以这样做:

       @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).first
      

    注意:您忽略了可能有更多符合条件的结果这一事实。如果您希望返回多个可能的行,那么您可能希望通过执行...来构建一个结果数组...

        @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).all
    

    并处理所有这些。

    1. 返回集是一个哈希。如果@zonename 指向其中一条记录,那么您可以这样做

       @zonename[:column_name] 
      

    引用一个名为“column_name”的字段。你不能这样做@zonename.column_name(你实际上可以使用一些元编程的辅助方法来装饰@zonename,但我们暂时忽略它)。

    Sequel 是一个出色的界面,您越了解它就会越喜欢它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      相关资源
      最近更新 更多