🐐
sqlxでnon-struct dest type struct with >1 columns (11)というエラーが出た
事象
non-struct dest type struct with >1 columns (11)
というエラーがでた。
「SQLの結果をマッピングする構造体が構造体ではないよ」という意味か「数が合ってないよ」と言われているのかと思いハマったのでメモ。
結論
マッピングする構造体のフィールド名が小文字始まりになっていたので、大文字始まりにすることで解消した。
コード
import (
"github.com/gorilla/sessions" "github.com/jmoiron/sqlx"
)
var (
db *sqlx.DB
)
func hoge() {
// ★★★この構造体のフィールド名が小文字始まりになっている★★★
var commentDtoList []struct {
c_ID int `db:"c_id"`
c_PostID int `db:"post_id"`
c_UserID int `db:"user_id"`
c_Comment string `db:"comment"`
c_CreatedAt time.Time `db:"c_created_at"`
u_ID int `db:"u_id"`
u_AccountName string `db:"account_name"`
u_Passhash string `db:"passhash"`
u_Authority int `db:"authority"`
u_DelFlg int `db:"del_flg"`
u_CreatedAt time.Time `db:"u_created_at"`
}
query :=
"SELECT " +
"c.`id` AS c_id , " +
"c.`post_id`, " +
"c.`user_id`, " +
"c.`comment`, " +
"c.`created_at` AS c_created_at, " +
"u.`id` AS u_id, " +
"u.`account_name`, " +
"u.`passhash`, " +
"u.`authority`, " +
"u.`del_flg`, " +
"u.`created_at` AS u_created_at " +
"FROM `comments` AS c " +
"JOIN `users` AS u " +
"ON c.`user_id` = u.`id` " +
"WHERE c.`post_id` = ? ORDER BY c.`created_at` DESC"
err = db.Select(&commentDtoList, query, post.ID)
if err != nil {
return nil, err
}
}
というわけでフィールド名を大文字始まりにする
var commentDtoList []struct {
C_ID int `db:"c_id"`
C_PostID int `db:"post_id"`
C_UserID int `db:"user_id"`
C_Comment string `db:"comment"`
C_CreatedAt time.Time `db:"c_created_at"`
U_ID int `db:"u_id"`
U_AccountName string `db:"account_name"`
U_Passhash string `db:"passhash"`
U_Authority int `db:"authority"`
U_DelFlg int `db:"del_flg"`
U_CreatedAt time.Time `db:"u_created_at"`
}
Discussion