Неправильные аргументы множественной вставки - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь выполнить массовую вставку в свою базу данных из CSV и могу вставить отдельные строки, но, очевидно, массовая вставка будет намного быстрее. Создание массивного запроса является грязным, поэтому я использовал https://godoc.org/github.com/huandu/go-sqlbuilder#InsertBuilder, который, кажется, правильно строит запрос и параметры.

Конструктор запросов & L oop:

// prepare insert query
ib := sqlbuilder.NewInsertBuilder()

ib.InsertInto(tableName)
ib.Cols(columns)

// stream file line by line for db ingestion
scanner := csv.NewScanner(file, csv.Comma(','), csv.SkipRecords(1), csv.FieldsPerRecord(-1))
fmt.Println("Uploading data...")
for scanner.Scan() {
    // split string by delimeter and trim whitespace if it's not the header row
    if count > 0 {
        record := scanner.Record()

        recordValues := make([]interface{}, len(record))
        for i, s := range record {
            recordValues[i] = s
        }

        ib.Values(recordValues...)
    }

    count++
}

// convert batch to sql
sql, args := ib.Build()

fmt.Println(sql)
fmt.Println(args)

// execute batch
_, err = tx.Exec(sql, args...)

Вывод этого запроса выглядит примерно так (обрезано, но правильно выглядит)

INSERT INTO table_name (столбцы 1-23) VALUES (?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?), (?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?), (?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?), (?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?), ...

И я даже не буду публиковать args, потому что это 34k слайсов.

Теперь, как мы видим, все подготовленные операторы ? существуют, так почему sqlx возвращает эту ошибку:

2020/02 / 14 02:18:22 sql: ожидается 23 аргумента, получено 34477

Похоже, что только первый пакет вставок является подготовленным оператором, а остальные игнорируются.

...