我使用graphql、typescript、mikro-orm和postgresql在post上实现crud。createdAt属性出现问题:
DriverException: alter table "post" alter column "created_at" type timestamptz(0) using ("created_at"::timestamptz(0)); - cannot cast type jsonb to timestamp with time zone
这是createdAt属性的实体:
@Field(() => String)
@Property({ type: "date" })
createdAt = new Date();
这两个是createdAt实体生成的迁移
this.addSql('alter table "post" drop constraint if exists "post_created_at_check";');
this.addSql('alter table "post" alter column "created_at" type timestamptz(0) using ("created_at"::timestamptz(0));');
我该如何修复这个错误?我需要更改哪些类型?
好吧,我解决了我的问题。在此之前,我要感谢Mikro orm的创建者做出的回应。
我决定放弃整个数据库,重新创建一个。它仍然不起作用,我发现yarn tsc -w
有一些错误,这意味着我必须删除dist
文件夹并再次运行该命令。
我终于开始犯不同的错误。我最初想用type String
替换type timestamptz(0)
,但显然我不太了解我的类型。
我四处搜索,最后更改了类型:
this.addSql(`CREATE TABLE "post" ("id" SERIAL NOT NULL, "title" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now())`);
该列已存在,并定义为jsonb
。Postgres不允许您将其转换为datetime,您需要先将其删除。
因此,调整您生成的迁移文件,使其首先删除列,然后重新添加;或者,如果您不知道如何构造查询,则可以删除此迁移,注释掉该属性,生成将为您删除的新迁移,执行它,然后取消注释并生成将正确添加它的新迁移。