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

Posted

技术标签:

【中文标题】属性类型日期和字段类型字符串的 Mikro-orm 迁移错误【英文标题】:Mikro-orm Migration error with the property type date and field type string 【发布时间】:2021-01-07 17:46:46 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

好的,我解决了我的问题。在此之前,我要感谢 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())`);

【讨论】:

【参考方案2】:

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

所以调整你生成的迁移文件,首先删除列并重新添加它,或者如果你不知道如何构造查询,你可以删除这个迁移,注释掉属性,生成新的为您删除它,执行它,然后取消注释并生成将正确添加它的新的。

【讨论】:

以上是关于属性类型日期和字段类型字符串的 Mikro-orm 迁移错误的主要内容,如果未能解决你的问题,请参考以下文章

数据值列类型和数据字段属性

MySQL字段属性介绍

Access中的数据类型和字段属性

MySQL数据类型及字段属性

如何将 MongoDB 中的属性从文本类型转换为日期类型?

MySQL之字段数据类型和列属性