Я использую функцию createUsers
для заполнения своей поддельной БД, просто для тестов.
Я использую функцию массового импорта pq
(https://godoc.org/github.com/lib/pq#hdr-Bulk_imports).
func createUsers() {
users := []models.User{}
for i := 0; i < 10; i++ {
users = append(users, models.User{Username: "username"+i, Age: i})
}
connStr := "user=postgres password=postgres dbname=dbname sslmode=disable"
DB, err = sql.Open("postgres", connStr)
checkErr(err)
txn, err := DB.Begin()
checkErr(err)
stmt, err := txn.Prepare(pq.CopyIn("users", "username", "age"))
checkErr(err)
for _, user := range users {
_, err = stmt.Exec(user.Username, user.Age)
checkErr(err)
}
_, err = stmt.Exec()
checkErr(err)
err = stmt.Close()
checkErr(err)
err = txn.Commit()
checkErr(err)
}
Все в этом коде работает хорошо.
НЕОБХОДИМОСТЬ:
Теперь мне нужно сделать его "общим", а не только для пользовательской модели.
Я думаю, мне нужно что-то вроде:
DBBulkInsert(users, "users", "username", "age")
с функцией DBBulkInsert
, например:
func DBBulkInsert(rows []interface{}, tableName string, tableColumns ...string) {
// DB var from connection func
txn, err := DB.Begin()
checkErr(err)
stmt, err := txn.Prepare(pq.CopyIn(tableName, tableColumns...))
checkErr(err)
for _, row := range rows {
_, err = stmt.Exec(row[0], row[1]) //THIS IS TOTALLY WRONG! WHAT TO DO HERE?
checkErr(err)
}
_, err = stmt.Exec()
checkErr(err)
err = stmt.Close()
checkErr(err)
err = txn.Commit()
checkErr(err)
}
ПРОБЛЕМА:
Очевидно, _, err = stmt.Exec(row[0], row[1])
совершенно неправильно. Я не понимаю, как вызвать DBBulkInsert
с моим массивом пользователей.
ЕЩЕ ЛУЧШЕ:
Может быть, яМожно также удалить параметры "users", "username", "age"
в DBBulkInsert(users, "users", "username", "age")
, но как? Отражение?