GORM 在插入时不填写外键 ID
GORM doesn't fill the foreign key id when doin an insert into
我有以下结构:
type Player struct {
ID uint `gorm:"primarykey"`
ClubID uint
Club Club
}
type Club struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"unique"`
}
我正在从文件中加载此信息,例如:
func TestSQLite(t *testing.T) {
pr, err := db.Init("file:memdb1?mode=memory&cache=shared")
if err != nil {
fmt.Println("Error on Init: " + err.Error())
t.Fail()
}
p := domain.Player{
Club: domain.Club{Name: "Hello"},
Shooting: 23,
PlayerPositions: []domain.Position{
{
Name: "SM",
},
},
}
if err := pr.Create(&p); err != nil {
fmt.Println("Error creating player: " + err.Error())
t.Fail()
}
c := domain.Player{
Club: domain.Club{Name: "Hello"},
Shooting: 23,
PlayerPositions: []domain.Position{
{
Name: "SM",
},
},
}
if err := pr.Create(&c); err != nil {
fmt.Println("Error creating player: " + err.Error())
t.Fail()
}
t.Logf("%d", p.ClubID)
t.Logf("%d", c.ClubID)
if c.ClubID != p.ClubID {
t.Fail()
}
}
结果我有:
db_test.go:45: 1
db_test.go:46: 0
创建代码是
return pr.preload().Debug().Create(&p).Error
预载为
func (pr *PlayerRepository) preload() *gorm.DB {
return pr.connection.
Preload("Club")
}
我不确定我做错了什么。
我忘了添加调试信息:
=== RUN TestSQLite
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.059ms] [rows:1] INSERT INTO `clubs` (`name`) VALUES ("Hello") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.032ms] [rows:1] INSERT INTO `positions` (`name`) VALUES ("KM") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.026ms] [rows:1] INSERT INTO `player_positions` (`player_id`,`position_id`) VALUES (1,1) ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.659ms] [rows:1] INSERT INTO `players` (`player_url`,`short_name`,`long_name`,`age`,`date_of_birth`,`height`,`weight`,`nationality_id`,`club_id`,`league_id`,`league_rank`,`overall`,`potential`,`value`,`wage`,`preferred_foot`,`international_reputation`,`weak_foot`,`skill_moves`,`work_rate`,`body_type`,`real_face`,`release_clause_eur`,`team_position_id`,`team_jersey_number`,`loaned_from`,`joined`,`contract_valid_until`,`nation_position_id`,`nation_jersey_number`,`pace`,`shooting`,`passing`,`dribbling`,`defending`,`physic`,`goal_keeper_diving`,`goal_keeper_handling`,`goal_keeper_kicking`,`goal_keeper_reflexes`,`goal_keeper_speed`,`goal_keeper_positioning`,`attacking_crossing`,`attacking_finishing`,`attacking_heading_accuracy`,`attacking_short_passing`,`attacking_volleys`,`skill_dribbling`,`skill_curve`,`skill_fk_accuracy`,`skill_long_passing`,`skill_ball_control`,`movement_acceleration`,`movement_sprint_speed`,`movement_agility`,`movement_reactions`,`movement_balance`,`power_shot_power`,`power_jumping`,`power_stamina`,`power_strength`,`power_long_shots`,`mentality_aggression`,`mentality_interceptions`,`mentality_positioning`,`mentality_vision`,`mentality_penalties`,`mentality_composure`,`defending_marking`,`defending_standing_tackle`,`defending_sliding_tackle`,`goal_keeping_diving`,`goal_keeping_handling`,`goal_keeping_kicking`,`goal_keeping_positioning`,`goal_keeping_reflexes`,`left_striker`,`striker`,`right_striker`,`left_winger`,`left_forward`,`center_forward`,`right_forward`,`right_winger`,`left_attacking_midfielder`,`central_attacking_midfielder`,`right_attacking_midfielder`,`left_midfielder`,`left_centre_midfielder`,`central_midfielder`,`right_centre_midfielder`,`right_midfielder`,`left_wing_back`,`left_defensive_midfielder`,`central_defensive_midfielder`,`right_defensive_midfielder`,`right_wing_back`,`left_back`,`left_center_attack`,`centre_back`,`right_centre_back`,`right_back`) VALUES ("","","",0,"",0,0,0,1,0,0,0,0,0,0,"","",0,0,"","","",0,0,0,"","","",0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.024ms] [rows:0] INSERT INTO `clubs` (`name`) VALUES ("Hello") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.023ms] [rows:1] INSERT INTO `positions` (`name`) VALUES ("SM") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.026ms] [rows:1] INSERT INTO `player_positions` (`player_id`,`position_id`) VALUES (2,2) ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.396ms] [rows:1] INSERT INTO `players` (`player_url`,`short_name`,`long_name`,`age`,`date_of_birth`,`height`,`weight`,`nationality_id`,`club_id`,`league_id`,`league_rank`,`overall`,`potential`,`value`,`wage`,`preferred_foot`,`international_reputation`,`weak_foot`,`skill_moves`,`work_rate`,`body_type`,`real_face`,`release_clause_eur`,`team_position_id`,`team_jersey_number`,`loaned_from`,`joined`,`contract_valid_until`,`nation_position_id`,`nation_jersey_number`,`pace`,`shooting`,`passing`,`dribbling`,`defending`,`physic`,`goal_keeper_diving`,`goal_keeper_handling`,`goal_keeper_kicking`,`goal_keeper_reflexes`,`goal_keeper_speed`,`goal_keeper_positioning`,`attacking_crossing`,`attacking_finishing`,`attacking_heading_accuracy`,`attacking_short_passing`,`attacking_volleys`,`skill_dribbling`,`skill_curve`,`skill_fk_accuracy`,`skill_long_passing`,`skill_ball_control`,`movement_acceleration`,`movement_sprint_speed`,`movement_agility`,`movement_reactions`,`movement_balance`,`power_shot_power`,`power_jumping`,`power_stamina`,`power_strength`,`power_long_shots`,`mentality_aggression`,`mentality_interceptions`,`mentality_positioning`,`mentality_vision`,`mentality_penalties`,`mentality_composure`,`defending_marking`,`defending_standing_tackle`,`defending_sliding_tackle`,`goal_keeping_diving`,`goal_keeping_handling`,`goal_keeping_kicking`,`goal_keeping_positioning`,`goal_keeping_reflexes`,`left_striker`,`striker`,`right_striker`,`left_winger`,`left_forward`,`center_forward`,`right_forward`,`right_winger`,`left_attacking_midfielder`,`central_attacking_midfielder`,`right_attacking_midfielder`,`left_midfielder`,`left_centre_midfielder`,`central_midfielder`,`right_centre_midfielder`,`right_midfielder`,`left_wing_back`,`left_defensive_midfielder`,`central_defensive_midfielder`,`right_defensive_midfielder`,`right_wing_back`,`left_back`,`left_center_attack`,`centre_back`,`right_centre_back`,`right_back`) VALUES ("","","",0,"",0,0,0,0,0,0,0,0,0,0,"","",0,0,"","","",0,0,0,"","","",0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
--- FAIL: TestSQLite (0.01s)
要添加更多信息,也许我想做的是使用此处所述的不同参考:https://gorm.io/docs/belongs_to.html#Override-References
所以我这样更改了结构:
type Club struct {
ID uint `gorm:"primarykey"`
Name string
}
type Player struct {
ID uint `gorm:"primarykey"`
ClubID string
Club Club `gorm:"references:Name"`
}
但是当我现在尝试时,我得到了
[error] invalid field found for struct roadmap/domain.Player's field Club, need to define a foreign key for relations or it need to implement the Valuer/Scanner interface
这是一个错误。金珠修好了。
我有以下结构:
type Player struct {
ID uint `gorm:"primarykey"`
ClubID uint
Club Club
}
type Club struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"unique"`
}
我正在从文件中加载此信息,例如:
func TestSQLite(t *testing.T) {
pr, err := db.Init("file:memdb1?mode=memory&cache=shared")
if err != nil {
fmt.Println("Error on Init: " + err.Error())
t.Fail()
}
p := domain.Player{
Club: domain.Club{Name: "Hello"},
Shooting: 23,
PlayerPositions: []domain.Position{
{
Name: "SM",
},
},
}
if err := pr.Create(&p); err != nil {
fmt.Println("Error creating player: " + err.Error())
t.Fail()
}
c := domain.Player{
Club: domain.Club{Name: "Hello"},
Shooting: 23,
PlayerPositions: []domain.Position{
{
Name: "SM",
},
},
}
if err := pr.Create(&c); err != nil {
fmt.Println("Error creating player: " + err.Error())
t.Fail()
}
t.Logf("%d", p.ClubID)
t.Logf("%d", c.ClubID)
if c.ClubID != p.ClubID {
t.Fail()
}
}
结果我有:
db_test.go:45: 1
db_test.go:46: 0
创建代码是
return pr.preload().Debug().Create(&p).Error
预载为
func (pr *PlayerRepository) preload() *gorm.DB {
return pr.connection.
Preload("Club")
}
我不确定我做错了什么。
我忘了添加调试信息:
=== RUN TestSQLite
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.059ms] [rows:1] INSERT INTO `clubs` (`name`) VALUES ("Hello") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.032ms] [rows:1] INSERT INTO `positions` (`name`) VALUES ("KM") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.026ms] [rows:1] INSERT INTO `player_positions` (`player_id`,`position_id`) VALUES (1,1) ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.659ms] [rows:1] INSERT INTO `players` (`player_url`,`short_name`,`long_name`,`age`,`date_of_birth`,`height`,`weight`,`nationality_id`,`club_id`,`league_id`,`league_rank`,`overall`,`potential`,`value`,`wage`,`preferred_foot`,`international_reputation`,`weak_foot`,`skill_moves`,`work_rate`,`body_type`,`real_face`,`release_clause_eur`,`team_position_id`,`team_jersey_number`,`loaned_from`,`joined`,`contract_valid_until`,`nation_position_id`,`nation_jersey_number`,`pace`,`shooting`,`passing`,`dribbling`,`defending`,`physic`,`goal_keeper_diving`,`goal_keeper_handling`,`goal_keeper_kicking`,`goal_keeper_reflexes`,`goal_keeper_speed`,`goal_keeper_positioning`,`attacking_crossing`,`attacking_finishing`,`attacking_heading_accuracy`,`attacking_short_passing`,`attacking_volleys`,`skill_dribbling`,`skill_curve`,`skill_fk_accuracy`,`skill_long_passing`,`skill_ball_control`,`movement_acceleration`,`movement_sprint_speed`,`movement_agility`,`movement_reactions`,`movement_balance`,`power_shot_power`,`power_jumping`,`power_stamina`,`power_strength`,`power_long_shots`,`mentality_aggression`,`mentality_interceptions`,`mentality_positioning`,`mentality_vision`,`mentality_penalties`,`mentality_composure`,`defending_marking`,`defending_standing_tackle`,`defending_sliding_tackle`,`goal_keeping_diving`,`goal_keeping_handling`,`goal_keeping_kicking`,`goal_keeping_positioning`,`goal_keeping_reflexes`,`left_striker`,`striker`,`right_striker`,`left_winger`,`left_forward`,`center_forward`,`right_forward`,`right_winger`,`left_attacking_midfielder`,`central_attacking_midfielder`,`right_attacking_midfielder`,`left_midfielder`,`left_centre_midfielder`,`central_midfielder`,`right_centre_midfielder`,`right_midfielder`,`left_wing_back`,`left_defensive_midfielder`,`central_defensive_midfielder`,`right_defensive_midfielder`,`right_wing_back`,`left_back`,`left_center_attack`,`centre_back`,`right_centre_back`,`right_back`) VALUES ("","","",0,"",0,0,0,1,0,0,0,0,0,0,"","",0,0,"","","",0,0,0,"","","",0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.024ms] [rows:0] INSERT INTO `clubs` (`name`) VALUES ("Hello") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.023ms] [rows:1] INSERT INTO `positions` (`name`) VALUES ("SM") ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.026ms] [rows:1] INSERT INTO `player_positions` (`player_id`,`position_id`) VALUES (2,2) ON CONFLICT DO NOTHING
2020/12/27 19:39:56 /Users/emanuele/personal/roadmap/io/db/db.go:41
[0.396ms] [rows:1] INSERT INTO `players` (`player_url`,`short_name`,`long_name`,`age`,`date_of_birth`,`height`,`weight`,`nationality_id`,`club_id`,`league_id`,`league_rank`,`overall`,`potential`,`value`,`wage`,`preferred_foot`,`international_reputation`,`weak_foot`,`skill_moves`,`work_rate`,`body_type`,`real_face`,`release_clause_eur`,`team_position_id`,`team_jersey_number`,`loaned_from`,`joined`,`contract_valid_until`,`nation_position_id`,`nation_jersey_number`,`pace`,`shooting`,`passing`,`dribbling`,`defending`,`physic`,`goal_keeper_diving`,`goal_keeper_handling`,`goal_keeper_kicking`,`goal_keeper_reflexes`,`goal_keeper_speed`,`goal_keeper_positioning`,`attacking_crossing`,`attacking_finishing`,`attacking_heading_accuracy`,`attacking_short_passing`,`attacking_volleys`,`skill_dribbling`,`skill_curve`,`skill_fk_accuracy`,`skill_long_passing`,`skill_ball_control`,`movement_acceleration`,`movement_sprint_speed`,`movement_agility`,`movement_reactions`,`movement_balance`,`power_shot_power`,`power_jumping`,`power_stamina`,`power_strength`,`power_long_shots`,`mentality_aggression`,`mentality_interceptions`,`mentality_positioning`,`mentality_vision`,`mentality_penalties`,`mentality_composure`,`defending_marking`,`defending_standing_tackle`,`defending_sliding_tackle`,`goal_keeping_diving`,`goal_keeping_handling`,`goal_keeping_kicking`,`goal_keeping_positioning`,`goal_keeping_reflexes`,`left_striker`,`striker`,`right_striker`,`left_winger`,`left_forward`,`center_forward`,`right_forward`,`right_winger`,`left_attacking_midfielder`,`central_attacking_midfielder`,`right_attacking_midfielder`,`left_midfielder`,`left_centre_midfielder`,`central_midfielder`,`right_centre_midfielder`,`right_midfielder`,`left_wing_back`,`left_defensive_midfielder`,`central_defensive_midfielder`,`right_defensive_midfielder`,`right_wing_back`,`left_back`,`left_center_attack`,`centre_back`,`right_centre_back`,`right_back`) VALUES ("","","",0,"",0,0,0,0,0,0,0,0,0,0,"","",0,0,"","","",0,0,0,"","","",0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
--- FAIL: TestSQLite (0.01s)
要添加更多信息,也许我想做的是使用此处所述的不同参考:https://gorm.io/docs/belongs_to.html#Override-References
所以我这样更改了结构:
type Club struct {
ID uint `gorm:"primarykey"`
Name string
}
type Player struct {
ID uint `gorm:"primarykey"`
ClubID string
Club Club `gorm:"references:Name"`
}
但是当我现在尝试时,我得到了
[error] invalid field found for struct roadmap/domain.Player's field Club, need to define a foreign key for relations or it need to implement the Valuer/Scanner interface
这是一个错误。金珠修好了。