我在我的 Go 应用程序中使用 PostgreSQL 和 GORM。
我认为使用
sql:"not null"
的sql选项卡可以防止空条目,但是当go使用字符串类型初始化结构时,它默认为空字符串,这与数据库中的null不同。
我想知道是否有一种方法可以防止在结构定义中发生这种情况,这样我就不必在应用程序代码的所有级别严格执行它。
您可以通过
using default: null
和 not null
约束一起解决防止 ''(空)字符串插入数据库的问题。因此,如果 Struct 字段值为空,它将被视为默认值 null
并且 gorm 将抛出错误。
gorm:"unique;not null;type:varchar(100);default:null"
示例是:
type User struct {
gorm.Model
Email string `gorm:"unique;not null;type:varchar(100);default:null"`
}
SO gorm 为空
User.Email
会抛出错误。
type User struct {
gorm.Model
Email string `gorm:"unique;not null;type:varchar(100);default:null"`
}
当我这样使用时,它可以工作,但是当我自动迁移时,我确实遇到了迁移 gorm 的错误
向模型中添加一个 isValid() 函数,如果默认字段不为空(0 表示 int,“” 表示字符串等),则返回 false,并且在插入之前检查是否有效,如果无效则返回错误,否则,无。
使用 before create 挂钩来验证电子邮件字段并在它为空字符串时返回错误是一种合理的方法。这样,您可以确保仅在正确填充必填字段时才创建对象。
// BeforeCreate hook to validate email field
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
if u.Email == "" {
return errors.New("email cannot be empty")
}
return nil
}