sql
  • ruby
  • execute
  • 2015-11-18 2 views 1 likes 
    1

    name = "Ben" Учитывая, это не работает:Зачем переменные нужны одинарные кавычки в SQL-запросе `execute`?

    DB.execute("SELECT id FROM departments WHERE name = #{name}") 
    

    но это (добавлено одиночные кавычки):

    DB.execute("SELECT id FROM departments WHERE name = '#{name}'") 
    

    Почему? Почему Ruby не вызывает переменную в первом примере? Это уже строка. Я не понимаю, почему это должно иметь значение. Разве это не эквивалентно прохождению "'Ben'"? Разве это не было бы эквивалентом прохождения "Ben"?

    +1

    использовать как этот 'DB.execute («SELECT идентификатора из отделов, где имя =?», Имя)' –

    ответ

    3

    Это не проблема Ruby, а проблема синтаксиса SQL.

    WHERE name = tom 
    

    и

    WHERE name = 'tom' 
    

    две разные вещи.

    В первом случае это рассматривается как имя объекта схемы (предположительно имя столбца здесь), во втором случае это строковый литерал.

    Вы сталкиваетесь с тем же вопросом, когда используете один язык программирования для создания программы для другого языка программирования (здесь Ruby -> SQL) с помощью прямой манипуляции с String.

    Правильный способ - использовать переменные связывания.

    WHERE name = ? 
    

    Это также относится к проблеме name, содержащей специальные символы.

    name = "Little Bobby Tables, see http://xkcd.com/327/" 
    
    +0

    , если т = «Томь», почему т введите SQL, как том, а не «Томь», и как имя объекта схемы, а не строковый литерал, который был установлен. – TheRealWinnebagoMan

    +0

    Если вы пишете '" Hello # {name} "', он выводит «Hello Tom» без кавычек. Это то, что он делает. Просто содержимое вашей строковой переменной. Если вам нужны котировки, вы должны их там положить. Как еще Ruby должен знать, что вам нужны цитаты? – Thilo

    Смежные вопросы