2009-02-08 15 views

risposta

17

Se possibile, utilizzare il modulo di Ruby DBI, e invece di cercare di citare le corde, l'uso parametrizzata preparato query, in questo modo:

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 saranno gestiti correttamente per voi, e le iniezioni sarà un acqua passata.

Modifica: notare che questo esempio mostra che nil viene passato come primo parametro da eseguire(). Corrisponde al primo? nella query e viene tradotto in "NULL" dal modulo DBI. Gli altri parametri sono ugualmente correttamente citati e inseriti nella query.

+0

Perché inserire un campo ID? Con un design normale questo sarebbe automaticamente incrementato. –

+0

È solo un esempio. Notare che il primo parametro da eseguire() è semplicemente nullo e che il parametro corrispondente nella query (il primo punto interrogativo) è per l'id. "id" viene inserito come NULL in questo esempio. – greyfade

+0

Volevo sapere la stessa cosa dell'OP, ma volevo semplicemente scrivere istruzioni SQL su un file, quindi immagino che le dichiarazioni preparate siano fuori dal tavolo allora? Potrei (ab) usare .inspect per l'escape delle stringhe? – Jan

3

Non è necessario utilizzare i binari, è possibile semplicemente require 'activerecord' e utilizzarlo come si farebbe in rotaie (definire modelli e utilizzarli). Quello che stai facendo è solo reinventare la ruota.

3

Scrivere una funzione per citare stringhe. Penso che Rails usi qualcosa del genere:

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

Vedere la risposta di greyfade. O di Andy Lester. Questa è solo una cattiva idea. –

+4

A volte stai lavorando su uno script di migrazione one-off e non hai gemme extra installate (nessun binario o dbi) e quando ciò accade, questa è una soluzione efficace. In quasi tutte le altre situazioni, dovresti usare le dichiarazioni preparate, naturalmente. –