GORM Playground Link
https://github.com/go-gorm/playground/pull/1
Description
某些场景下,我希望通过Model接口,动态地根据数据模型的属性值决定最终的TableName,但是实际是失效的。 下面列举了简单的复现步骤
假设我定义了了一个数据模型:
type Account struct {
Id int `gorm:"primaryKey;id"`
UserName string `gorm:"unique; user_name"`
Money int `gorm:"money"`
Market string `gorm:"market"`
tblName string `gorm:"-"`
}
func (a *Account)TableName() string {
return a.tblName
}
当我按照以下用法使用时:
db.Model(&Account{tblName: "acc_tab_01"}).Create(data)
此时生成的SQL语句中一定会缺失TableName。
因为gorm内部在生成TableName时,并不是使用我在Model接口传入的Account实例。而是通过反射机制,基于Account实例的数据类型,构造了一个新的实例,因此所有的成员信息全部丢失
Comment From: jinzhu
by design, use Table