我想在 drizzle 中使用串行类型,但在迁移时出现此错误。我找不到原因,我正在从 drizzle-orm/pg-core 导入序列。
error: type "serial" does not exist
这是我的架构:
export const likes = pgTable("likes", {
postId: text("post_id").notNull().primaryKey(),
authorId: integer("author_id"),
});
export const posts = pgTable("post", {
id: serial("id").notNull().primaryKey(),
code: text("content"),
language: text("content"),
likes: integer("likes"),
authorId: integer("author_id")
.notNull()
.references(() => users.id),
});
export const users = pgTable("user", {
id: serial("id").notNull().primaryKey(),
username: text("username").unique(),
name: text("name"),
email: text("email").notNull(),
emailVerified: timestamp("emailVerified", { mode: "date" }),
image: text("image"),
});
从错误信息来看,Drizzle 无法识别串口类型。这是因为 Drizzle 可以与不同的数据库引擎配合使用,而串行类型是 PostgreSQL 独有的。 使用integer() 类型而不是serial() 类型来解决问题,因为integer() 是所有数据库引擎都支持的常见SQL 类型。
试试这段代码,这里我使用了integer()类型而不是serial()类型:
export const likes = pgTable("likes", {
postId: text("post_id").notNull().primaryKey(),
authorId: integer("author_id"),
});
export const posts = pgTable("post", {
id: integer("id").notNull().primaryKey(),
code: text("content"),
language: text("content"),
likes: integer("likes"),
authorId: integer("author_id")
.notNull()
.references(() => users.id),
});
export const users = pgTable("user", {
id: integer("id").notNull().primaryKey(),
username: text("username").unique(),
name: text("name"),
email: text("email").notNull(),
emailVerified: timestamp("emailVerified", { mode: "date" }),
image: text("image"),
});
另外,与serial类型不同,integer()类型不支持自动递增,所以尝试使用这个SQL查询来允许posts表的id列自动递增:
CREATE SEQUENCE post_id_seq;
ALTER TABLE posts ALTER COLUMN id SET DEFAULT nextval('post_id_seq');
希望它有效:)
您正确地尝试使用毛毛雨的 PostgreSQL 列类型 -
serial()
或 serial4()
(只是一个别名)。
自动递增4字节整数,方便创建唯一标识符列(类似于其他一些数据库支持的AUTO_INCRMENT属性)。
import { pgTable, serial } from "drizzle-orm/pg-core";
export const table = pgTable('table', {
serial: serial('serial'),
});
我通过查看我的 postgres 数据库确认它可以工作,该数据库现在包含递增值: