Я бы хотел пакетно вставить много элементов с тем же подготовленным оператором в sqlite3, используя go-sqlite3 .
Я ищу что-то вроде конструкции mongodb для вставки массива записей того же типа с автоматической обработкой транзакций / пакетов.
Я представляю что-то вроде следующего:
type Rec struct {
A string
B string
}
db, err := sql.Open("sqlite3", "my.db")
checkErr(err)
stmt, err := db.Prepare("INSERT INTO Recs(a, b) values(?,?)")
checkErr(err)
R1 := Rec{"A":1,"B":2}
R2 := Rec{"A":3,"B":4} // in practice, some loop generates these...
Recs := []{R1,R2}
_, err = stmt.ExecMany(Recs)
Существует ли такой синтаксис для sqlite?
В настоящее время я делаю следующее:
var Recs []Rec
batch := 0
for i:=0;i<100000; i++ {
R := Rec{"A":i,"B":i+1}
Recs = append(Recs, R)
if (batch % 100) {
tx, err := db.Begin()
stmt, err := db.Prepare("INSERT INTO Recs(a, b) values(?,?)")
for _, r := range Recs {
_, err = stmt.Exec(r.A, r.B)
checkErr(err)
}
err = tx.Commit()
checkErr(err)
Recs = Recs[0:0]
batch = 1
} else {
batch = batch + 1
}
}
но это супер медленно , и я продолжаю выдавать ошибки с такими ошибками, как:
panic: database is locked.