Быстро, пакетно, вставляемая конструкция в go-sqlite3? - PullRequest
0 голосов
/ 14 ноября 2018

Я бы хотел пакетно вставить много элементов с тем же подготовленным оператором в 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...