postgresql 如何在新的毛毛雨对象中表示pg中的'bytea'数据类型?

hmae6n7t  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(167)

我正在尝试学习新的毛毛雨orm的node js,我在这里试图创建一个小的auth数据库,看看orm如何工作。
使用“pnpmdrizzle-kitgenerate:pg”,我从pg数据库生成了一个模式,但是bytea数据类型没有被解析为ts。因为毛毛雨是新的天气,所以医生没有办法解决我的问题。我需要一种方法来表示毛毛雨orm中的bytea pg数据类型。**
下面是由drizzle kit生成的模式代码。

export const user = pgTable(
  "user",
  {
    id: uuid("id").primaryKey().notNull(),
    firstname: varchar("firstname", { length: 35 }).notNull(),
    middlename: varchar("middlename", { length: 35 }),
    lastname: varchar("lastname", { length: 35 }).notNull(),
    // TODO: failed to parse database type 'bytea'
    passphrase: unknown("passphrase").notNull(),
    // TODO: failed to parse database type 'bytea'
    salt: unknown("salt").notNull(),
    email: varchar("email", { length: 50 }).notNull(),
  },
  (table) => {
    return {
      email: uniqueIndex("user_email").on(table.email),
    };
  }
);
xxe27gdn

xxe27gdn1#

您可以使用自定义类型。下面是bytea自定义类型的实现:

const bytea = customType<{ data: Buffer; notNull: false; default: false }>({
  dataType() {
    return "bytea";
  },
});

您可以使用toDriver和fromDriver函数将app数据Map到db类型,将db类型Map到app数据。例如,如果你想在db中存储bytea,但想在应用程序中以十六进制字符串的形式检索它,你可以这样做:

const bytea = customType<{ data: string; notNull: false; default: false }>({
  dataType() {
    return "bytea";
  },
  toDriver(val) {
    let newVal = val;
    if (val.startsWith("0x")) {
      newVal = val.slice(2);
    }

    return Buffer.from(newVal, "hex");
  },
  fromDriver(val) {
    return val.toString("hex");
  },
});

相关问题