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

vec*_*ccy 14 ruby sql sequel

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

目前我正在尝试这个:

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

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

if @zonename.name = "UK"
Run Code Online (Sandbox Code Playgroud)

Jer*_*ans 15

请注意,而不是:

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

你应该做:

DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode)
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*ley 11

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

  1. 你可以这样做:

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

    注意:您忽略了可能有更多匹配条件的结果的事实.如果您希望返回多个可能的行,那么您可能希望通过执行以下操作来构建一个结果数组...

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

    并处理所有这些.

  2. 返回集是一个哈希值.如果@zonename指向其中一条记录,那么你就可以做到

    @zonename[:column_name] 
    
    Run Code Online (Sandbox Code Playgroud)

    引用名为"column_name"的字段.你不能这样做@zonename.colum_nname(你可以@zonename使用一些元编程实际上用辅助方法进行装饰,但暂时忽略它).

续集是一个很好的界面,你越了解它就越喜欢它.