如何使用gorm制作外键
How to make foreign key using gorm
我有这两个模型:
用户模型:
type User struct {
DBBase
Email string `gorm:"column:email" json:"email"`
Password string `gorm:"column:password" json:"-"`
}
func (User) TableName() string {
return "t_user"
}
用户信息模型:
type UserInfo struct {
User User `gorm:"foreignkey:u_id;association_foreignkey:id"`
UID uint `gorm:"column:u_id" json:"-"`
FirstName string `gorm:"column:first_name" json:"first_name"`
LastName string `gorm:"column:last_name" json:"last_name"`
Phone string `gorm:"column:phone" json:"phone"`
Address string `gorm:"column:address" json:"address"`
}
func (UserInfo) TableName() string {
return "t_user_info"
}
并且我想让 UID 与用户的 ID 相关 table。
这是创建用户的函数:
func (dao *AuthDAO) Register(rs app.RequestScope, user *models.User, userInfo *models.UserInfo) (userErr error, userInfoErr error) {
createUser := rs.Db().Create(&user)
userInfo.UID = user.ID
createUserInfo := rs.Db().Create(&userInfo)
return createUser.Error, createUserInfo.Error
}
我确实尝试了 gorm 在文档中写的内容,但没有成功:
http://doc.gorm.io/associations.html
Note!
from gorm 2.0 this is no longer necessary, read more here:
gorm.io/docs/belongs_to.html#FOREIGN-KEY-Constraints
解决办法是在迁移数据库的时候加入这一行:
db.Model(&models.UserInfo{}).AddForeignKey("u_id", "t_user(id)", "RESTRICT", "RESTRICT")
阅读 https://gorm.io/docs/belongs_to.html 中的属于关系
另外,这里有一个很好的例子:https://medium.com/@the.hasham.ali/how-to-use-uuid-key-type-with-gorm-cc00d4ec7100
// User is the model for the user table.
type User struct {
Base
SomeFlag bool `gorm:"column:some_flag;not null;default:true"`
Profile Profile
}// Profile is the model for the profile table.
type Profile struct {
Base
Name string `gorm:"column:name;size:128;not null;"`
UserID uuid.UUID `gorm:"type:uuid;column:user_foreign_key;not null;"`
}
我们可以在最新版本中使用CreateConstraint
添加外键约束。
示例:
假设我们有两个实体
type User struct {
gorm.Model
CreditCards []CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
现在为用户创建数据库外键 & credit_cards
db.Migrator().CreateConstraint(&User{}, "CreditCards")
db.Migrator().CreateConstraint(&User{}, "fk_users_credit_cards")
转换为以下 SQL Postgres 代码:
ALTER TABLE `credit_cards` ADD CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
参考:
对于 Gorm 的最新版本,即 1.21.x
如果您有一对一的字段映射但没有父子映射,这就是您要做的
type BaseConfig struct {
ID uuid.UUID `gorm:"primary_key" json:"id"`
}
type Ledger struct {
BaseConfigId uuid.UUID `json:"base_config_id"`
BaseConfig BaseConfig `gorm:"column:base_config_id;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
在迁移脚本中,您需要按照 docs
进行操作
WriteClient.Migrator().CreateConstraint(&models.BaseConfig{}, "Ledgers")
WriteClient.Migrator().CreateConstraint(&models.BaseConfig{}, "fk_base_configs_id")
我觉得触发点是缺少有关如何关联的文档。可能需要一些杂耍才能弄清楚,所以希望我的回答能节省一些时间。
我发现以下代码无需执行任何自定义迁移代码即可正确创建外键;只是通常的 AutoMigrate
.
type Account struct {
ID uint `gorm:"primary_key"`
}
type Transaction struct {
ID uint `gorm:"primary_key"`
AccountID uint
Account Account `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
}
我正在使用 gorm.io/gorm v1.23.3
.
的依赖项“Gorm 2.0”
我有这两个模型:
用户模型:
type User struct {
DBBase
Email string `gorm:"column:email" json:"email"`
Password string `gorm:"column:password" json:"-"`
}
func (User) TableName() string {
return "t_user"
}
用户信息模型:
type UserInfo struct {
User User `gorm:"foreignkey:u_id;association_foreignkey:id"`
UID uint `gorm:"column:u_id" json:"-"`
FirstName string `gorm:"column:first_name" json:"first_name"`
LastName string `gorm:"column:last_name" json:"last_name"`
Phone string `gorm:"column:phone" json:"phone"`
Address string `gorm:"column:address" json:"address"`
}
func (UserInfo) TableName() string {
return "t_user_info"
}
并且我想让 UID 与用户的 ID 相关 table。
这是创建用户的函数:
func (dao *AuthDAO) Register(rs app.RequestScope, user *models.User, userInfo *models.UserInfo) (userErr error, userInfoErr error) {
createUser := rs.Db().Create(&user)
userInfo.UID = user.ID
createUserInfo := rs.Db().Create(&userInfo)
return createUser.Error, createUserInfo.Error
}
我确实尝试了 gorm 在文档中写的内容,但没有成功: http://doc.gorm.io/associations.html
Note!
from gorm 2.0 this is no longer necessary, read more here: gorm.io/docs/belongs_to.html#FOREIGN-KEY-Constraints
解决办法是在迁移数据库的时候加入这一行:
db.Model(&models.UserInfo{}).AddForeignKey("u_id", "t_user(id)", "RESTRICT", "RESTRICT")
阅读 https://gorm.io/docs/belongs_to.html 中的属于关系 另外,这里有一个很好的例子:https://medium.com/@the.hasham.ali/how-to-use-uuid-key-type-with-gorm-cc00d4ec7100
// User is the model for the user table.
type User struct {
Base
SomeFlag bool `gorm:"column:some_flag;not null;default:true"`
Profile Profile
}// Profile is the model for the profile table.
type Profile struct {
Base
Name string `gorm:"column:name;size:128;not null;"`
UserID uuid.UUID `gorm:"type:uuid;column:user_foreign_key;not null;"`
}
我们可以在最新版本中使用CreateConstraint
添加外键约束。
示例: 假设我们有两个实体
type User struct {
gorm.Model
CreditCards []CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
现在为用户创建数据库外键 & credit_cards
db.Migrator().CreateConstraint(&User{}, "CreditCards")
db.Migrator().CreateConstraint(&User{}, "fk_users_credit_cards")
转换为以下 SQL Postgres 代码:
ALTER TABLE `credit_cards` ADD CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
参考:
对于 Gorm 的最新版本,即 1.21.x
如果您有一对一的字段映射但没有父子映射,这就是您要做的
type BaseConfig struct {
ID uuid.UUID `gorm:"primary_key" json:"id"`
}
type Ledger struct {
BaseConfigId uuid.UUID `json:"base_config_id"`
BaseConfig BaseConfig `gorm:"column:base_config_id;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
在迁移脚本中,您需要按照 docs
进行操作WriteClient.Migrator().CreateConstraint(&models.BaseConfig{}, "Ledgers")
WriteClient.Migrator().CreateConstraint(&models.BaseConfig{}, "fk_base_configs_id")
我觉得触发点是缺少有关如何关联的文档。可能需要一些杂耍才能弄清楚,所以希望我的回答能节省一些时间。
我发现以下代码无需执行任何自定义迁移代码即可正确创建外键;只是通常的 AutoMigrate
.
type Account struct {
ID uint `gorm:"primary_key"`
}
type Transaction struct {
ID uint `gorm:"primary_key"`
AccountID uint
Account Account `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
}
我正在使用 gorm.io/gorm v1.23.3
.