首先,資料庫是用sqlite3 test.db < schema.sql.
內容schema.sql:
CREATE TABLE x (
id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE y (
id INTEGER PRIMARY KEY,
name TEXT,
x_id INTEGER REFERENCES x
);
然后程式運行go run main.go。
內容main.go:
package main
import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
type X struct {
ID uint
Name string
Ys []*Y
}
type Y struct {
ID uint
Name string
X *X `gorm:"column:x_id"`
}
func (X) TableName() string {
return "x"
}
func (Y) TableName() string {
return "y"
}
func main() {
db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
x := &X{Name: "X"}
y := &Y{Name: "Y", X: x}
x.Ys = []*Y{y}
db.Create(&x)
}
之后fatal error: stack overflow被拋出。
我想這與所涉及的結構和物件的遞回性質有關。當我注釋掉該Ys []*Y行時y := &Y{Name: "Y", X: x},x.Ys = []*Y{y}它成功地將“X”插入到 table 中x,但是當我注釋掉Ys []*Yand x.Ys = []*Y{y}only 并更改db.Create(&x)為db.Create(&y)none 時,會在任一表中插入。
編輯
它保存x并且ywheny := &Y{Name: "Y", X: x}更改為y := &Y{Name: "Y"},但使用x_idas NULL。
uj5u.com熱心網友回復:
問題確實與關系的遞回性質有關:Xcontains[]Y和Ycontains X。
正如檔案中所解釋的,has-many 關系僅使用uint外鍵列進行建模:
type X struct {
ID uint
Name string
Ys []*Y `gorm:"foreignKey:XID"`
}
type Y struct {
ID uint
Name string
XID uint `gorm:"column:x_id"`
}
而且你不需要設定y.XID,它會自動填充。
uj5u.com熱心網友回復:
實作 Valuer 介面就可以了。
func (x X) Value() (driver.Value, error) {
return int64(x.ID), nil
}
https://gorm.io/docs/data_types.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422115.html
標籤:
上一篇:如何獲取陣列中字串的索引?
