2009-02-08 13 views

Respuesta

17

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.

+0

¿Por qué incluso insertar un campo de identificación? Con el diseño normal esto se incrementaría automáticamente. –

+0

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

+0

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

3

No tiene que usar rieles, puede simplemente require 'activerecord' y utilizarlo como lo haría en rieles (defina modelos y utilícelos). Lo que estás haciendo allí es solo reinventar la rueda.

3

Escribe una pequeña función para citar cadenas. Creo que Rails solo usa algo como esto:

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

Ver la respuesta de greyfade. O el de Andy Lester. Esta es solo una mala idea. –

+4

A veces estás trabajando en un script de migración único y no tienes gemas adicionales instaladas (sin rieles o dbi) y cuando eso sucede, esta es una solución efectiva. En casi cualquier otra situación, debe usar declaraciones preparadas, por supuesto. –

Cuestiones relacionadas