2009-02-08 2 views

ответ

17

Если возможно, используйте модуль рубин DBI, и вместо того, чтобы процитировать ваши строки, использование параметризованном подготовлены запросы, например:

dbh = DBI.connect("DBI:Mysql:test:localhost", "testuser", "testpass") 
sth = dbh.prepare("INSERT INTO people (id, name, height) VALUES(?, ?, ?)") 
File.open("people.txt", "r") do |f| 
    f.each_line do |line| 
    name, height = line.chomp.split("\t") 
    sth.execute(nil, name, height) 
    end 
end 

Цитирование будут обработаны должным образом для вас, и инъекции будет в прошлом.

Редактировать: Обратите внимание, что этот пример показывает, что nil передается как первый параметр для выполнения(). Это соответствует первому? в запросе и переводится в «NULL» модулем DBI. Другие параметры аналогичным образом правильно цитируются и вставляются в запрос.

+0

Зачем даже вставлять поле id? При нормальном дизайне это будет автоматически увеличиваться. –

+0

Это всего лишь пример. Но обратите внимание, что первый параметр для выполнения() просто равен нулю, а соответствующий параметр в запросе (первый знак вопроса) - для id. В этом примере «id» вставляется как NULL. – greyfade

+0

Я хотел знать то же самое, что и OP, но я хотел просто написать инструкции SQL в файл, так что, я думаю, что подготовленные выписки из таблицы? Могу ли я (ab) использовать .inspect для экранирования строк? – Jan

3

Вам не нужно использовать рельсы, вы можете просто require 'activerecord' и использовать его так же, как в рельсах (определите модели и используйте их). То, что вы делаете, просто заново изобретает колесо.

3

Напишите функцию wee, чтобы указать строки. Я думаю, что Rails просто использует что-то вроде этого:

def quote_string(v) 
    v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''") 
end 
+0

См. Ответ greyfade. Или Энди Лестера. Это всего лишь плохая идея. –

+4

Иногда вы работаете над одноразовым сценарием миграции и не устанавливаете никаких дополнительных драгоценных камней (без рельсов или dbi), и когда это произойдет, это эффективное решение. В любой другой ситуации вы должны, конечно, использовать подготовленные заявления. –