1

createUsersテストのためだけに、func を使用して偽の DB にデータを入力しています。

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])に完全に間違っています。DBBulkInsertusers 配列で呼び出す方法がわかりません。

まだ良いです:

のパラメータも削除できるかもしれませんが"users", "username", "age"DBBulkInsert(users, "users", "username", "age")どうすればよいですか? 反射?

4

1 に答える 1