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 😉

1 Kommentar zu „SQLite3 Ruby Batch Inserting Values

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.