postgresql(drizzle-orm)中的时间戳可用于存储和更新到新的Date()吗?

问题描述 投票:0回答:1

我想在我的postgresql(drizzle-orm)中存储一个latestUpdatedAt变量。这是我的架构:

export const documentsTable = pgTable(
  "documents",
  {
    id: serial("id").primaryKey(),
    displayId: uuid("display_id").defaultRandom().notNull().unique(),
    title: varchar("title", { length: 100 }).notNull(),
    content: text("content").notNull(),
    latestText: text("latestText").notNull(),
    pinnedMessageId: varchar("pinned_message_id").default(""),
    retrivedMessage:integer("retrived_message").default(-100000),
    latestUpdatedAt: timestamp("latestUpdatedAt").notNull().defaultNow(),//latestUpdatedAt
  },
  (table) => ({
    displayIdIndex: index("display_id_index").on(table.displayId),
  }),
);

我想在每次更新latestText时更新latestUpdatedAt。以下是我更新变量的方法:

const updateDocument = async () => {
  if (!debouncedDocument) return;
  const res = await fetch(`/api/documents/${documentId}`, {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      title: debouncedDocument.title,
      content: debouncedDocument.content,
      latestText: debouncedDocument.latestText,
      messages: debouncedDocument.messages,
      pinnedMessageId: debouncedDocument.pinnedMessageId,
      retrivedMessage: debouncedDocument.retrivedMessage,
      latestUpdatedAt: debouncedDocument.latestUpdatedAt,
    }),
  });
  if (!res.ok) {
    return;
  }
  const data: Document = await res.json();
  else if(dbDocument?.latestText!== data.latestText){
    router.refresh();
    console.log("refreshed_message");
  }
};
 const setContent = (newContent: string,newLatestText:string) => {
    if (document === null) return;
    console.log(new Date());
    setDocument({
      ...document,
      latestText:newLatestText,
      latestUpdatedAt:new Date(),//I think here's the problem
    });
 };

这是我的更新文档架构:

import { z } from "zod";
export const updateDocSchema = z.object({
  title: z.string().optional(),
  content: z.string().optional(),
  latestText: z.string().optional(),
  messages: z.array(z.object({text:z.string().optional(), author:z.string().optional(),sendAt:z.date().optional()})).optional(),
  pinnedMessageId: z.string().optional(),
  retrivedMessage: z.number().optional(),
  latestUpdatedAt: z.date().optional(),
});

当我评论latestUpdatedAt部分时,latestText工作正常,并在更新latestUpdatedAt变量时收到错误:400,所以我猜问题是时间戳无法存储

new Date()

我想知道是否可以存储和更新

new Date()
,以及如何解决这个问题。谢谢!

postgresql date timestamp sql-timestamp drizzle
1个回答
0
投票

根据最新文档:

您可以将时间戳的类型推断为日期:

// will infer as date
timestamp: timestamp('timestamp', { mode: "date" }),

举个例子,

export const documentsTable = pgTable(
  "documents",
  {
    // ...
    latestUpdatedAt: timestamp("latestUpdatedAt", { mode: 'date' })
      .notNull()
      .defaultNow(),
  },
  // ...
);

这将允许您在使用 UPDATE 时使用

new Date()
,例如

db.update(documentsTable)
  .set({
    // ...
    latestUpatedAt: new Date(),
  })
  .where(/* YOUR_CONDITION */),
© www.soinside.com 2019 - 2024. All rights reserved.