2009-07-10 4 views
2

Bei Verwendung der Ruby/MSQL-Bibliothek habe ich ein Objekt vom Typ Mysql :: Result zurückgegeben. Wie würde ich eine Zeichenfolge erstellen, die das Objekt durchläuft und eine gültige MySQL-Abfrage erstellt? Ich habe Probleme herauszufinden, wie das letzte Komma aus der Ausgabe unten, und wie diese Ausgabe zurück an die Methode query() übergeben wird.Konstruieren einer gültigen MySQL-Abfrage mit Ruby/MySQL

require 'mysql' 
dbh = Mysql.real_connect("host", "user", "pass", "db") 
res = dbh.query("SELECT name, category FROM animals") 
printf "INSERT INTO animals (name, category) VALUES (\n" 
res.each_hash do |row| 
printf "('%s', '%s'),\n", row["name"], row["category"] 
end 
printf ")\n" 

#Output  
INSERT INTO animals (name, category) VALUES (
    ('snake', 'reptile'), 
    ('frog', 'amphibian'), 
    ('tuna', 'fish'), 
    ('raccoon', 'mammal'), 
    ) 

Antwort

3
values = [] 
res.each_row do |r| 
    values << "(#{r.map{|x| dbh.quote(x) }.join(", ")})" 
end 
query =<-SQL 
    INSERT INTO animals(name, category) VALUES 
    (#{values.join(",\n")} 
    ) 
SQL 

puts query 
+0

Das ist es. Erledigt. – Swanand

+0

Vielen Dank! Aber wie fügt man die einfachen Anführungszeichen hinzu? query = "INTO Tiere INSERT (Name, Kategorie) VALUES (# {values.join (", ")})" gibt INSERT INTO Tiere (Name, Kategorie) VALUES ((Schlange, Reptilien), (Frosch, Amphibie), (Thunfisch, Fisch), (Racoon, Säugetier)) – jtorrance

+0

normale String-Interpolation verwenden –

2

Ich benutze in diesem Fall kommen würde, also eher als Looping, und das Hinzufügen von einem Komma jedes Mal so etwas wie:

["One", "Two", "Three"].join(',') 

Sie benötigen Ihre Hash in ein Array drehen natürlich mit den Elementen, an denen Sie interessiert sind! Versuchen Sie folgendes:

(res.each_hash{|row| "(#{row["name"]}, #{row["category"]})"}).join(",") 
1

Eine Möglichkeit, dies zu tun, wäre zu:

require 'mysql'  
    dbh = Mysql.real_connect("host", "user", "pass", "db")  
    res = dbh.query("SELECT name, category FROM animals") 
    stmt = "INSERT INTO animals (name, category) VALUES ("  
    res.each_hash do |row| 
     stmt << "(#{row["name"]}, #{row["category"]})" 
    end  
    stmt << ")" 

"wie diese Ausgabe passieren zurück auf die Abfrage() -Methode"

 dbh.query(stmt) 
1

im Allgemeinen, wenn Sie nicht nur irgendeine Ruby-Magie (wie .join()) wollen, können Sie einfach den Array/Hash nach Index durchlaufen und nur das Komma hinzufügen, wenn es nicht das letzte Element ist:

if(index < array.length) string << ",\n" 
+0

Join ist Ruby Magic? Ja wirklich? s = ""; def sfoo; setzt "foo"; Ende; Am foo ist Magie. instance_eval {define_method ...}} ist magisch. const_missing ist Magie. Join fügt Dinge mit einer anderen Sache zusammen, die irgendwie überwältigend ist, wenn man darüber nachdenkt. –

+0

meh, nenn mich alte Schule. ich stimme zu, dass es am rande von "rubin magic" liegt, aber trotzdem rubin magic (IMHO). – twolfe18

+0

Wie ist beizutreten weniger magisch diese Länge oder << für diese Angelegenheit? – Codebeef

0

Danke für alle Vorschläge. Ben Hughes 'Beispiel verwendend, ist hier die' gehashte 'Version:

values = [] 
res.each_hash do 
    |row| values << "('#{row.map{|d,x| dbh.quote(x) }.join("', '")}')" 
    end 
puts values.join(",") 

query="INSERT INTO animals (name, category) VALUES #{values.join(", ")}" 
dbh.query(query) 
Verwandte Themen