🐐

sqlxでnon-struct dest type struct with >1 columns (11)というエラーが出た

2023/10/22に公開

事象

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