属性类型日期和字段类型字符串的Mikro-orm迁移错误

问题描述

我正在使用graphql,typescript,mikro-orm和postgresql在帖子上实现分类属性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));');

如何解决错误?我需要更改哪些类型?

解决方法

该列已存在,并定义为jsonb。 Postgres不允许您将其转换为日期时间,您需要先将其删除。

因此,请调整生成的迁移文件,以首先删除该列并再次添加它,或者,如果您不知道如何构造查询,则可以删除此迁移,注释掉属性,生成新的迁移文件为您删除它,执行它,然后取消注释并生成可以正确添加它的新代码。

,

好的,我解决了我的问题。在此之前,我要感谢Mikro-orm的创建者的答复。

我决定删除整个数据库并创建一个新数据库。 仍然无法正常工作,我发现yarn tsc -w有一些错误,这意味着我不得不删除dist文件夹并再次运行命令。

我终于开始收到不同的错误。我首先想到用type timestamptz(0)替换type String,但显然我不正确知道我的类型。

我搜索了一下,最后更改了类型:

    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())`);