KING 博主等级

一帆风顺 ⛵️⛵️⛵️

Go

Go SQL error converting NULL to string is unsupported

钟晓川
2023-06-21 / 13 点赞 / 437 阅读

查询的perms字段可能存在为空的数据情况

func (m *MenuModel) QueryAllPerms(userId int64) (perms []string) {
	sqlStr := "SELECT m.perms FROM sys_user_role ur " +
		"LEFT JOIN sys_role_menu rm ON ur.role_id = rm.role_id " +
		"LEFT JOIN sys_menu m ON rm.menu_id = m.menu_id " +
		"WHERE ur.user_id = ?"
	m.Raw(sqlStr, userId).Find(&perms).Error
}

抛异常:

sql: Scan error on column index 0, name "perms": converting NULL to string is unsupported; sql: Scan error on column index 0, name "perms": converting
 NULL to string is unsupported; sql: Scan error on column index 0, name "perms": converting NULL to string is unsupported

支持 NULL 或其他未知数的数据库表列不应将 SQL 查询值保存为基本 Go 类型,而是应将其值保存到 database.sql Null 类型。 这些包括 NullString、NullBool、NullInt64、NullFloat64 和 NullTime。

解决方案一,修改收的数据类型 perms []sql.NullString

func (m *MenuModel) QueryAllPerms(userId int64) (perms []sql.NullString) {
	sqlStr := "SELECT m.perms FROM sys_user_role ur " +
		"LEFT JOIN sys_role_menu rm ON ur.role_id = rm.role_id " +
		"LEFT JOIN sys_menu m ON rm.menu_id = m.menu_id " +
		"WHERE ur.user_id = ?"
	m.Raw(sqlStr, userId).Find(&perms).Error
}

解决方案二,数据库表字段设置默认值

13