Как выполнять необработанные SQL-запросы с помощью Sequel - PullRequest
14 голосов
/ 30 июня 2010

Мне пока не ясно, как правильно выполнять необработанные SQL-запросы с помощью Sequel.

В настоящее время я пытаюсь это:

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

Как я могу выполнить запросы как необработанный SQL, а затем получить доступ к результатам как обычно?

if @zonename.name = "UK"

Ответы [ 2 ]

15 голосов
/ 17 августа 2012

Обратите внимание, что вместо:

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

вы должны сделать:

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

В противном случае вы открываете себя для внедрения SQL, если не контролируете содержимое @dialcode.

11 голосов
/ 30 июня 2010

У меня есть несколько указателей, которые могут быть полезны:

  1. Вы можете просто сделать:

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

    NB. Вы игнорируете тот факт, что может быть больше результатов, соответствующих критериям. Если вы ожидаете, что будет возвращено несколько возможных строк, вы, вероятно, захотите построить массив результатов, выполнив ...

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

    и обрабатывает их все.

  2. Возвращаемый набор - хеш. Если @zonename указывает на одну из записей, вы можете сделать

    @zonename[:column_name] 
    

    для ссылки на поле с именем "column_name". Вы не можете сделать @zonename.colum_nname (вы могли бы на самом деле украсить @zonename вспомогательными методами с использованием некоторого метапрограммирования, но давайте пока проигнорируем это).

Сиквел - отличный интерфейс, чем больше вы узнаете о нем, тем больше он вам понравится.

...