先说一个貌似不是问题的问题,zero框架生成的或者文档给出的源码中可能会缺少应该导入的包
如果你使用goland会自动导入;但如果是vscode或者其他编辑器需要注意这个问题
————————————————————————————————————————-——
下面接着扯zero框架数据库相关
zero在生成insert、update代码时默认排除这两个字段
create_time
update_time
但是,不包括delete_time
;通读生成后的代码你就会发现;insert代码中delete_time
作为一个必要的参数被嵌入在代码中;如果在传参的结构体中不填该字段;可能会得到Incorrect datetime value: '0000-00-00' for column 'delete_time' at row1
所以,需要排除这个字段,或者自己写insert代码
#排除该字段
userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
另一个问题
对于特殊字段,要注意为null问题
#delete_time字段要允许为null,且默认为null
`delete_time` timestamp(3) NULL DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
如果sql字段约束、类型不正确;生成的代码可能会有这种情况
DeleteTime time.Time `db:"deleted_at"`
CreateTime time.Time `db:"created_time"`
UpdateTime time.Time `db:"updated_time"`
它本应为
DeleteTime sql.NullTime `db:"deleted_at"`
CreateTime time.Time `db:"created_time"`
UpdateTime time.Time `db:"updated_time"`
如果后期需要修改某表的字段,生成的CURD代码中除了表的结构体;CURD的函数也需要修改;否则会出现一些问题。(因为CURD的函数对表的结构体耦合性比较高)
总体来讲zero重点还是在rpc,使rpc更好用;更简单。
对于数据库的封装一般情况,不要过度依赖。