Si es posible, utilice el módulo de Ruby DBI, y en lugar de tratar de citar sus cadenas, el uso parametrizada consultas preparadas, así:
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
Citando se manejará adecuadamente para usted, y las inyecciones será una cosa del pasado.
Editar: Tenga en cuenta que este ejemplo muestra que nil se pasa como el primer parámetro para ejecutar(). Corresponde al primero? en la consulta, y se traduce a "NULO" por el módulo DBI. Los demás parámetros se citan de forma similar y se insertan en la consulta.
¿Por qué incluso insertar un campo de identificación? Con el diseño normal esto se incrementaría automáticamente. –
Es solo un ejemplo. Pero tenga en cuenta que el primer parámetro para ejecutar() es simplemente nil, y el parámetro correspondiente en la consulta (el primer signo de interrogación) es para id. "id" se está insertando como NULL en este ejemplo. – greyfade
Quería saber lo mismo que el OP, pero quería simplemente escribir sentencias SQL en un archivo, ¿entonces supongo que las declaraciones preparadas están fuera de la mesa? ¿Podría (ab) usar .inspect para escaparse de cadenas? – Jan