ค้นหาเว็บไซต์

typescript - ข้อผิดพลาดการโยกย้าย Mikro-orm กับประเภทคุณสมบัติเป็น date และประเภทฟิลด์เป็น string


ฉันกำลังใช้ 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 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())`);

คำตอบ #2

คอลัมน์มีอยู่แล้วและถูกกำหนดเป็น jsonb Postgres จะไม่อนุญาตให้คุณแปลงเป็น datetime คุณจะต้องลบมันก่อน

ดังนั้นปรับไฟล์การย้ายข้อมูลที่คุณสร้างขึ้นให้ลบคอลัมน์ก่อนแล้วเพิ่มมันกลับอีกครั้ง หรือถ้าคุณไม่รู้วิธีสร้างคำสั่ง SQL คุณสามารถลบการย้ายข้อมูลนี้ คอมเมนต์คุณสมบัติออก สร้างไฟล์ใหม่ที่จะลบมันให้คุณ จากนั้นรันมัน แล้วจึงยกเลิกคอมเมนต์และสร้างไฟล์ใหม่ที่จะเพิ่มมันอย่างถูกต้อง