跳到主要内容

内省

使用 Prisma ORM 内省你的数据库

为了本指南的目的,我们将使用一个包含三个表的示例 SQL Schema

CREATE TABLE "public"."User" (
id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255),
email VARCHAR(255) UNIQUE NOT NULL
);

CREATE TABLE "public"."Post" (
id SERIAL PRIMARY KEY NOT NULL,
title VARCHAR(255) NOT NULL,
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
content TEXT,
published BOOLEAN NOT NULL DEFAULT false,
"authorId" INTEGER NOT NULL,
FOREIGN KEY ("authorId") REFERENCES "public"."User"(id)
);

CREATE TABLE "public"."Profile" (
id SERIAL PRIMARY KEY NOT NULL,
bio TEXT,
"userId" INTEGER UNIQUE NOT NULL,
FOREIGN KEY ("userId") REFERENCES "public"."User"(id)
);

注意:有些字段使用了双引号,以确保 PostgreSQL 使用正确的字符大小写。如果未使用双引号,PostgreSQL 会将所有内容视为小写字符。

展开查看表格的图形概览

用户

列名类型主键外键必需默认
idSERIAL✔️✔️自增
nameVARCHAR(255)-
emailVARCHAR(255)✔️-

文章

列名类型主键外键必需默认
idSERIAL✔️✔️自增
createdAtTIMESTAMP✔️now()
titleVARCHAR(255)✔️-
contentTEXT-
publishedBOOLEAN✔️false
authorIdINTEGER✔️✔️-

个人资料

列名类型主键外键必需默认
idSERIAL✔️✔️自增
bioTEXT-
userIdINTEGER✔️✔️-

下一步,你将内省数据库。内省的结果将是你的 Prisma Schema 中的一个数据模型

运行以下命令内省数据库

npx prisma db pull

此命令读取定义在 .env 文件中的 DATABASE_URL 环境变量并连接到你的数据库。连接建立后,它会内省数据库(即读取数据库 Schema)。然后它会将数据库 Schema 从 SQL 转换为你的 Prisma Schema 中的数据模型。

内省完成后,你的 Prisma Schema 将被更新

Introspect your database with Prisma ORM

数据模型现在看起来类似于这样(注意模型的字段已被重新排序以提高可读性)

prisma/schema.prisma
model Post {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
createdAt DateTime @default(now()) @db.Timestamp(6)
content String?
published Boolean @default(false)
authorId Int
User User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

model User {
id Int @id @default(autoincrement())
name String? @db.VarChar(255)
email String @unique @db.VarChar(255)
Post Post[]
Profile Profile?
}

Prisma ORM 的数据模型是你数据库 Schema 的声明式表示,并作为生成的 Prisma Client 库的基础。你的 Prisma Client 实例将暴露针对这些模型量身定制的查询。

现在,数据模型中存在一些小“问题”

  • User 关系字段使用了大写,因此不符合 Prisma 的命名约定。为了表达更多“语义”,如果此字段名为 author 以更好地描述 UserPost 之间的关系,那会更好。
  • User 上的 PostProfile 关系字段,以及 Profile 上的 User 关系字段都使用了大写。为了遵守 Prisma 的命名约定,这两个字段都应该小写为 postprofileuser
  • 即使小写后,User 上的 post 字段名称仍然有点不恰当。这是因为它实际上是指一个文章列表——因此更好的名称应该是复数形式:posts

这些更改与生成的 Prisma Client API 相关,其中使用小写的关系字段 authorpostsprofileuser 对于 JavaScript/TypeScript 开发者来说会更自然和惯用。因此你可以配置你的 Prisma Client API

因为关系字段虚拟的(即它们不直接体现在数据库中),你可以在 Prisma Schema 中手动重命名它们,而无需更改数据库

prisma/schema.prisma
model Post {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
createdAt DateTime @default(now()) @db.Timestamp(6)
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
user User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

model User {
id Int @id @default(autoincrement())
name String? @db.VarChar(255)
email String @unique @db.VarChar(255)
posts Post[]
profile Profile?
}

在此示例中,数据库 Schema 确实遵循了 Prisma ORM 模型的命名约定(只有从内省生成的虚拟关系字段不符合约定,需要调整)。这优化了生成的 Prisma Client API 的易用性。

使用自定义模型和字段名称

有时,你可能希望对 Prisma Client API 中暴露的列和表的名称进行额外更改。一个常见的例子是将数据库 Schema 中常用的snake_case(蛇形命名法)转换为 JavaScript/TypeScript 开发者更自然的PascalCase(帕斯卡命名法)和camelCase(驼峰命名法)。

假设你从内省中获得了基于snake_case(蛇形命名法)的以下模型

model my_user {
user_id Int @id @default(autoincrement())
first_name String?
last_name String @unique
}

如果你为此模型生成 Prisma Client API,它的 API 中会采用snake_case(蛇形命名法)

const user = await prisma.my_user.create({
data: {
first_name: 'Alice',
last_name: 'Smith',
},
})

如果你不想在 Prisma Client API 中使用数据库中的表和列名,你可以使用@map@@map 来配置它们

model MyUser {
userId Int @id @default(autoincrement()) @map("user_id")
firstName String? @map("first_name")
lastName String @unique @map("last_name")

@@map("my_user")
}

使用这种方法,你可以随意命名你的模型及其字段,并使用 @map(用于字段名)和 @@map(用于模型名)指向底层的表和列。你的 Prisma Client API 现在看起来如下:

const user = await prisma.myUser.create({
data: {
firstName: 'Alice',
lastName: 'Smith',
},
})

配置你的 Prisma Client API 页面了解更多信息。