2009-05-14 7 views
1
USER = "user" 
PASS = "pass" 

QUERY = "SELECT c1, c2, c3, c4, c5, c6, c7 FROM table" 

SQLITE_SCHEMA = 'c1, c2, c3, c4, c5, c6, c7' 

sqlite_db = SQLite3::Database.new('sqlite.db') 
odbc_db = DBI.connect('DBI:ODBC:database', USER, PASS) 
odbc_db.select_all(QUERY) do |entry| 
    sqlite_db.execute "insert into smnt (" + SQLITE_SCHEMA + ") values ('" + entry[0].to_s + "','" + 
                      entry[1].to_s + "','" + 
                      entry[2].to_s + "','" + 
                      entry[3].to_s + "','" + 
                      entry[4].to_s + "','" + 
                      entry[5].to_s + "','" + 
                      entry[6].to_s + "')" 
    end 

Il doit y avoir une façon plus propre d'écrire la chaîne db.execute, ou suis-je pointilleux?Une question de style ruby ​​d'un débutant

Répondre

4

En dehors de la boucle dans la réponse de hypoxide, pensez aussi en utilisant l'interpolation de variables:

sqlite_db.execute "insert into smnt (#{SQLITE_SCHEMA}) 
    values (#{entry.map {|e| "'#{e.to_s}'"}.join(',')})" 

Notez que vos entry éléments avaient mieux tous être aseptisé, ou se préparer à un monde de la douleur, le style Bobby Tables.

+2

putain ... me devança :) –

+1

* lol * Je suis allé porc entier et toute utilisation de évitais + du tout, mais c'est juste ma préférence. :-P –

+1

J'aime vraiment ça. J'ai besoin de m'entraîner à penser de cette façon. – rubynewbie

1

Vous pourriez écrire une boucle for pour la chaîne ... vous enregistreriez quelques lignes de code.

1

Que diriez-vous:

" VALUES (#{entry.collect{|e|"'"+e.to_s+"'"}.join(",")})"