Подтвердить что ты не робот

Как запускать сырые SQL-запросы с помощью Sequel

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

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

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

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

if @zonename.name = "UK"
4b9b3361

Ответ 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
    

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

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

    @zonename[:column_name] 
    

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

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

Ответ 2

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

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

вам следует:

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

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