如何使用Sequel运行原始SQL查询

时间:2010-06-29 21:15:53

标签: sql ruby sequel

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

目前我正在尝试这个:

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

如何以原始SQL的形式运行查询,然后像正常一样访问结果?

if @zonename.name = "UK"

2 个答案:

答案 0 :(得分:15)

请注意,而不是:

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

你应该这样做:

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

否则,如果您不控制@dialcode的内容,则打开SQL注入。

答案 1 :(得分:11)

我有一些可能有用的指针:

  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
    

    并处理所有这些。

  2. 返回集是一个哈希值。如果@zonename指向其中一条记录,则可以执行

    @zonename[:column_name] 
    

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

  3. 续集是一个优秀的界面,你越了解它就越了解它。