如何阻止Go gorm在Postgres中对我的自引用外键强制使用非null约束



我需要创建一个在gorm中引用自己的表,但无法理解为什么它会对我强制使用not null约束。我完全被难住了。我该怎么绕过这个?我正在使用gorm提供的自动迁移功能来创建表。一旦我删除外键约束,not null约束就会消失,但这不是我想要的。

编辑:我正在使用程序包";gorm.io/gorm";具体来说,不是Github上的那个。这也是唯一一个给我带来问题的表,任何其他具有引用其他表的外键的表都可以正常工作。

使用外键

type User struct {
ID *int `gorm:"primaryKey; type:serial"`
Username string `gorm:"type: varchar(32) not null unique"`
Password string `gorm:"type: varchar(128) not null"`
ReferredBy *int
Referrer *User `gorm:"foreignKey:ReferredBy;constraint:OnUpdate:CASCADE,ONDELETE:SET NULL"`
}

根据pgAdmin使用外键生成SQL

-- Table: public.users
-- DROP TABLE public.users;
CREATE TABLE public.users
(
id integer NOT NULL DEFAULT nextval('users_id_seq'::regclass),
username character varying(32) COLLATE pg_catalog."default" NOT NULL,
password character varying(128) COLLATE pg_catalog."default" NOT NULL,
referred_by integer NOT NULL DEFAULT nextval('users_referred_by_seq'::regclass),
CONSTRAINT users_pkey PRIMARY KEY (id),
CONSTRAINT users_username_key UNIQUE (username),
CONSTRAINT fk_users_referrer FOREIGN KEY (referred_by)
REFERENCES public.users (id) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE SET NULL
)
TABLESPACE pg_default;
ALTER TABLE public.users
OWNER to msmf;

不使用外键

// User Model. ReferredBy is self referencing Foreign Key
type User struct {
ID *int `gorm:"primaryKey; type:serial"`
Username string `gorm:"type: varchar(32) not null unique"`
Password string `gorm:"type: varchar(128) not null"`
ReferredBy *int
}

在不告诉gorm存在外键的情况下生成SQL

-- Table: public.users
-- DROP TABLE public.users;
CREATE TABLE public.users
(
id integer NOT NULL DEFAULT nextval('users_id_seq'::regclass),
username character varying(32) COLLATE pg_catalog."default" NOT NULL,
password character varying(128) COLLATE pg_catalog."default" NOT NULL,
referred_by bigint,
CONSTRAINT users_pkey PRIMARY KEY (id),
CONSTRAINT users_username_key UNIQUE (username)
)
TABLESPACE pg_default;
ALTER TABLE public.users
OWNER to msmf;

显然type:serial标签可以做到这一点。如果你放弃它,非空约束也不会存在:

type User struct {
ID       uint   `gorm:"primarykey"`
Username string `gorm:"type: varchar(32) not null unique"`
Password string `gorm:"type: varchar(128) not null"`
ReferredBy *int
Referrer   *User `gorm:"foreignKey:ReferredBy;constraint:OnUpdate:CASCADE,ONDELETE:SET NULL;"`
}

参考github问题。

最新更新