SQLite3 Ruby Batch Inserting Values
Hier eine praktische Ruby-Klasse, die gemäß den Vorschlägen in diesem StackOverflow-Thread vorgeht, um auf einmal viele Zeilen in bspw. SQLite zu schreiben (also als „union select“; es gibt noch andere DBs, die sich so verhalten..). Einträge so oder einzeln eintragen: Ihr werdet den Unterschied merken! 😉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class DBDumper def initialize(table_name, col_names, db) @db = db @table_name = table_name @col_names = col_names @vals = [] end def enqueue(val) @vals << val puts "warn: wrong len in #{val}" if val.length != @col_names.length dump() if @vals.length % 200 == 0 end def gen_sql() first = (0...@col_names.length).to_a.inject([]) { |res,idx| res << "'#{@col_names[idx]}' AS '#{@vals.first[idx].to_s}' " }.join(', ') rest = @vals[1..-1].map { |v| "union select #{v.map { |e| " '#{e.to_s}' "}.join(', ')}" }.join(' ') "insert into #{@table_name} select #{first} #{rest};" end def dump @db.execute(gen_sql()) @vals = [] end end db = SQLite3::Database.new('mydb.sqlite') dbd = DBDumper.new('mytable', %w( colA colB ), db) dbd.enqueue(['vala', 'valb']) dbd.enqueue(['valc', 'vald']) dbd.dump() |
Was natürlich bei diesem Ansatz ein Problem ist: PRIMARY KEYS werden nicht automatisch mit eingefügt.. Was das bedeutet, werdet ihr spätestens merken, wenn ihr in eine entsprechende Tabelle Daten eintragen wollt. Wenn jemand weiß, wie damit umzugehen ist, bitte hier melden 😉
Toll, dass hier regelmaessig gepostet wird.