Prisma: Node.js 和 TypeScript 的下一代 ORM
ORM:对象关系映射是一种使用 OOP 语言与数据库通信的方法,无需编写复杂的查询。
mkdir prisma-example cd prisma-example
npm init -y
npm install prisma dotenv express --save-dev
npm install @prisma/client --save-dev
这将为您的数据库安装 Prisma 客户端。
npx prisma init
这将创建一个 prisma 目录,其中包含:
该视频可能使用 PostgreSQL,但您可以将其改编为 MySQL、SQLite 或其他。在本示例中,我们将使用 PostgreSQL。
在您的 .env 文件中,添加连接字符串。 PostgreSQL 示例:
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
将 your_user、your_password 和 your_database 替换为您的实际凭据。如果您没有本地 PostgreSQL 服务器,则需要安装并配置一个。
将 prisma/schema.prisma 的内容替换为以下内容:
mkdir prisma-example cd prisma-example
npm init -y
这会在node_modules/@prisma/client 中生成类型安全的 Prisma 客户端。
npm install prisma dotenv express --save-dev
这会在 prisma/migrations 目录中创建一个新的迁移文件,并将其应用到您的数据库,从而创建表。 --name init 为迁移提供了一个描述性名称。
在根目录下创建db.config.js文件,添加以下代码:
npm install @prisma/client --save-dev
这将创建一个 PrismaClient 的新实例并将其导出,以便可以在其他文件中使用。 log: ['query'] 选项会将所有查询记录到控制台。
在项目根目录中创建一个controllers.js 文件。以下是controllers.js文件中CRUD操作的代码:
npx prisma init
在项目根目录中创建一个routes.js 文件。以下是routes.js文件中CRUD操作的代码:
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
在项目根目录中创建一个 server.js 文件。以下是server.js文件中CRUD操作的代码:
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
npx prisma generate
这将执行脚本,在数据库中创建用户和帖子,然后更新用户并删除帖子。
您可以使用 Postman 通过以下路线测试 API:
在 Postman 中将 POST 请求的正文设置为 JSON,并包含以下数据:
npx prisma migrate dev --name init
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
Prisma 提供了多种聚合函数,允许您直接在数据库查询中对数据集执行计算。这些函数对于汇总数据和获得见解非常有用,而无需将大量数据获取到您的应用程序。
假设我们有以下产品型号:
mkdir prisma-example cd prisma-example
npm init -y
npm install prisma dotenv express --save-dev
npm install @prisma/client --save-dev
npx prisma init
Prisma 提供了一组丰富的过滤选项,可让您精确查询数据库。以下是带有示例的全面概述:
等于(默认): 检查是否完全相等。
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
not:否定条件。
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
gt(大于)、gte(大于或等于)、lt(小于)、lte(小于或等于):用于数字和日期/时间比较。
npx prisma generate
包含: 检查字符串是否包含子字符串。
npx prisma migrate dev --name init
startsWith: 检查字符串是否以前缀开头。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
endsWith: 检查字符串是否以后缀结尾。
import prisma from "./db.config.js"; // create user export const createUser = async (req, res) => { const { name, email } = req.body; const existing_user = await prisma.user.findUnique({ where: { email, }, }); if (existing_user) { return res.status(400).json({ message: "User already exists" }); } const user = await prisma.user.create({ data: { email, name, }, }); return res.status(201).json(user); }; // create post export const createPost = async (req, res) => { const { title, content, user_id } = req.body; const post = await prisma.post.create({ data: { title, content, user_id, }, }); return res.status(201).json(post); }; // get all users export const getUsers = async (req, res) => { const users = await prisma.user.findMany({ include: { posts: true, }, }); return res.status(200).json(users); }; // read specific user by id export const getUserById = async (req, res) => { const { id } = req.params; const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, include: { posts: true, }, }); if (!user) { return res.status(404).json({ message: "User not found" }); } return res.status(200).json(user); }; // update user export const updateUser = async (req, res) => { const { id } = req.params; const { name, email } = req.body; const user = await prisma.user.update({ where: { id: parseInt(id), }, data: { name, email, }, }); return res.status(200).json(user); }; // delete user export const deleteUser = async (req, res) => { const { id } = req.params; const user = await prisma.user.delete({ where: { id: parseInt(id), }, }); return res.status(200).json(user); }; // create similar for post
模式:不敏感: 执行不区分大小写的搜索。
import express from "express"; import { createUser, createPost, getUsers, getUserById, updateUser, deleteUser, } from "./controllers.js"; const router = express.Router(); router.post("/users", createUser); router.get("/users", getUsers); router.get("/users/:id", getUserById); router.put("/users/:id", updateUser); router.delete("/users/:id", deleteUser); // create similar for post router.post("/posts", createPost); // router.get('/posts', getPosts); // router.get('/posts/:id', getPostById); // router.put('/posts/:id', updatePost); // router.delete('/posts/:id', deletePost); export default router;
in: 检查列表中是否存在值。
import express from "express"; import dotenv from "dotenv"; import router from "./routes.js"; dotenv.config(); const app = express(); app.use(express.json()); app.use("/api", router); const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
notIn: 检查某个值是否不出现在列表中。
node index.js
AND: 使用逻辑 AND 组合多个条件。
{ "name": "John Doe", "email": "sample@example.com" }
OR: 使用逻辑 OR 组合多个条件。
// get all posts of a user with id const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, include: { posts: true, }, }); // select specific fields of user with post details const user = await prisma.user.findUnique({ where: { id: parseInt(id), }, select: { name: true, posts: { select: { title: true, content: true, }, }, }, }); // get all users name with their posts count (Aggregation) const req_data = await prisma.user.findMany({ select: { id: true, name: true, _count: { select: { post: true, }, }, }, });
NOT: 否定一组条件。
model Product { id Int @id @default(autoincrement()) name String price Float category String createdAt DateTime @default(now()) }
您可以根据相关型号进行过滤。
mkdir prisma-example cd prisma-example
npm init -y
您可以组合这些运算符来实现复杂的过滤逻辑。
npm install prisma dotenv express --save-dev
这些示例涵盖了 Prisma 中最常见的过滤场景。通过组合这些运算符和嵌套过滤器,您可以创建非常精确的查询来检索所需的确切数据。请记得查阅 Prisma 官方文档以获取最新、详细的信息。
Prisma 的 orderBy 选项允许您对查询结果进行排序。以下是一些演示其用法的示例:
升序(默认):
npm install @prisma/client --save-dev
降序:
npx prisma init
您可以指定多个字段进行排序,每个字段都有不同的方向。 Prisma 将首先按第一个字段排序,然后按第一个字段中相同值组中的第二个字段排序,依此类推。
DATABASE_URL="postgresql://your_user:your_password@localhost:5432/your_database"
在此示例中,帖子将主要按作者姓名升序排序。如果多个帖子具有相同的作者,则它们将按标题降序排列。
如上例所示,您可以按相关模型上的字段进行排序。
generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // Or "mysql", "sqlite", etc. url = env("DATABASE_URL") } model Post { id String @id @default(uuid()) title String content String? createdAt DateTime @default(now()) author User @relation(fields: [user_id], references: [id]) user_id Int } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }
这将根据作者的电子邮件地址对帖子进行排序。
您也可以按日期和时间字段排序。
npx prisma generate
您可以按一个字段进行过滤并按另一字段进行排序。例如,您可能想要查找名称中包含“test”的所有用户,但按电子邮件地址对他们进行排序:
npx prisma migrate dev --name init
您可以控制排序中如何处理空值。 nulls 选项可以设置为第一个或最后一个。
import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient({ log: ["query"], }); export default prisma;
默认情况下,按升序排序时,空值放在最后;按降序排序时,空值放在最前面。 nulls 选项允许您覆盖此默认行为。
Prisma 擅长优雅地处理数据库关系。以下是关键方面:
在架构中定义关系:您可以使用 @relation 属性直接在 schema.prisma 文件中定义模型之间的关系。
关系类型: Prisma 支持:
让我们使用前面示例中的 User 和 Post 模型:
mkdir prisma-example cd prisma-example
希望这可以帮助您更好地理解 Prisma ORM。
欢迎提出您的反馈和建议。
感谢您的阅读! ?
以上是Prisma ORM:使用 JS 开始到结束项目的详细内容。更多信息请关注PHP中文网其他相关文章!