Как запускать необработанные SQL-запросы с Sequel

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

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

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

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

if @zonename.name = "UK"

2 ответов


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

  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". Ты не можешь этого сделать!--4--> (вы могли бы на самом деле украсить @zonename С вспомогательными методами, использующими некоторое мета-программирование, но давайте проигнорируем это на данный момент).

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


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

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

вы должны:

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

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