跳到主要内容

内省

使用 Prisma ORM 内省您的数据库

在本指南中,我们将使用一个包含三个表的演示 SQL 模式。

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 模式中的 数据模型

运行以下命令内省您的数据库

npx prisma db pull

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

内省完成后,您的 Prisma 模式会更新

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 的数据模型是对数据库模式的声明式表示,并作为生成的 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 模式中手动重命名它们,而无需更改数据库。

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?
}

在此示例中,数据库模式遵循了 Prisma ORM 模型的命名约定(只有从内省生成的虚拟关系字段不符合这些约定,需要调整)。这优化了生成的 Prisma Client API 的人体工程学。

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

但是,有时您可能希望对 Prisma Client API 中公开的列和表名称进行其他更改。一个常见的例子是将数据库模式中常用的snake_case 表示法转换为对 JavaScript/TypeScript 开发人员来说更自然的PascalCasecamelCase 表示法。

假设您从内省中获得了以下基于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 页面。