centos 网站搭建,为什么不建议做运维,重庆市城市建设档案馆官方网站,网站怎么更新NextJS 数据库 之 遇上Prisma ORM 前言一、环境要求二、概念介绍1、Prisma Schema Language#xff08;PSL#xff09; 结构描述语言1.1 概念1.2 组成1.2.1 Data Source 数据源1.2.2 Generators 生成器1.2.3 Data Model Definition 数据模型定义字段(数据)类型和约束关系PSL 结构描述语言1.1 概念1.2 组成1.2.1 Data Source 数据源1.2.2 Generators 生成器1.2.3 Data Model Definition 数据模型定义字段(数据)类型和约束关系Relations枚举Enum 2、Prisma Client 数据交互接口2.1 概念2.2 使用示例 3、Prisma Migrate 迁移与种子3.1 概念3.2 迁移流程3.3 数据库迁移Migrate3.3 数据种子Seeding 4、Prisma CLI 命令行工具initgenerate 三、Next.js 中应用示例1、全新项目示例1.1 项目初始化1.2 初始化Prisma ORM1.3 数据迁移1.4 播种数据可选1.5 模拟业务 前言 在 Next.js 全栈开发的时候不免要用到数据库采用原生数据库语法可能还需要顾虑很多方面的问题(语法安全、原生语法麻烦/繁琐/复杂、更换数据库时的语法兼容等等)为了解决这类问题诞生了ORMObject-Relational Mapping数据访问方式技术及周边工具; 这里介绍一个易用又强大的ORM框架/工具库Prisma ORM 官网https://www.prisma.io/ GitHubhttps://github.com/prisma/prisma 内容包含以下两个部分 重点概念 Prisma Schema Language (PSL).用来描述数据库架构的语言 两个主要(常用)操作库 Prisma Client为 Node.js 和 TypeScript 自动生成类型安全的查询生成器 可用于任何Node.js 或 TypeScript 后端应用程序包括无服务器应用程序和微服务。Prisma Migrate声明式数据建模和迁移系统 主要用于生产部署、数据迁移等应用场景 附 Prisma CLI辅助快捷的操作命令工具
延展辅助(平台服务)
Prisma Postgres[链接]托管的 PostgreSQL 数据库服务Prisma Accelerate[链接]针对现有数据库的完全托管的全局连接池和缓存层可直接从 Prisma ORM 支持查询级缓存策略。Prisma Optimize[链接]针对数据操作基于AI进行优化分析服务Prisma Studio[链接]用于查看和编辑等操作的数据库可视化GUI工具
一、环境要求 最新环境要求可前往官方文档https://www.prisma.io/docs/orm/reference/system-requirements 软件
工具最低要求版本Node.js18.8 / 20.9 / 22.11TypeScript (可选)5.1.XYarn (可选)1.19.2(当使用Yarn 1时)
操作系统
Linux
OpenSSL 1.0.x、1.1.x 或 3.xzliblibz.so.1libgcc( libgcc_s.so.1)C 标准库大多数 Linux 发行版上的 glibc 或 Alpine Linux 上的 musl libc
Windows
Microsoft Visual C 可再发行组件 2015或必须安装更新版本
macOS
macOS 10.15 或更新版本
二、概念介绍
1、Prisma Schema LanguagePSL 结构描述语言
1.1 概念 Prisma Schema Language简称PSL - Prisma ORM 的核心部分 用于定义数据库模型、关系、以及生成 Prisma Client 的配置文件。 【Prisma Schema 参数文档】https://www.prisma.io/docs/orm/reference/prisma-schema-reference 想要将架构拆分为多个文件 Prisma ORM 5.15.0 及更高版本中的 prismaSchemaFolder 预览功能 支持多文件 Prisma Schema 。 它是一个声明式语言通过定义 .prisma 文件来描述数据库结构和关系。 Prisma Client将基于(PSL)生成数据库交互代码。
1.2 组成
Data Source数据库源例如PostgreSQL or MongoDB…Generators数据模型生成器例如Prisma ClientData model definition数据模型定义例如user数据表有哪些字段、分别什么数据类型等
1.2.1 Data Source 数据源 定义数据库的连接信息通常包括数据库的类型例如PostgreSQL、MySQL、SQLite等、连接URL、以及数据库的其他配置。 示例
datasource db {provider postgresql // 指定 PostgreSQL 作为数据库url env(DATABASE_URL) // 从环境变量 DATABASE_URL 获取连接字符串
}1.2.2 Generators 生成器 定义生成器的配置Prisma默认使用生成Prisma Client。 通常会在此配置生成的Prisma Client存放的位置以及语言TypeScript/JavaScript。 示例
generator client {provider prisma-client-jsoutput ./generated/client
}1.2.3 Data Model Definition 数据模型定义 定义数据库中的实体表。每个model对应数据库中的一个表表的字段对应model中的属性。 可以定义字段的类型、默认值、约束如id、unique等以及关系如relation。 model User {id Int id default(autoincrement())email String uniquename Stringposts Post[]
}model Post {id Int id default(autoincrement())title Stringcontent String?author User relation(fields: [authorId], references: [id])authorId Int
}字段(数据)类型和约束
每个字段可以指定数据类型支持多种类型如Int、String、Boolean、DateTime、Float、Decimal等。 可以通过default()设置默认值unique设置唯一约束id定义主键等。
更多内置约束https://www.prisma.io/docs/orm/reference/prisma-schema-reference#attributes
model Post {id Int id default(autoincrement())title Stringpublished Boolean default(false)createdAt DateTime default(now())
}关系Relations
PSL支持定义实体之间的关系。常见的关系包括一对一1:1、一对多1:N和多对多M:N。通过relation定义。
更多关系说明https://www.prisma.io/docs/orm/prisma-schema/data-model/relations
// 示例一对多关系model User {id Int id default(autoincrement())posts Post[]
}model Post {id Int id default(autoincrement())userId Intauthor User relation(fields: [userId], references: [id])
}枚举Enum
PSL还支持枚举类型用于表示有多个固定选项的字段。
// 示例enum Role {USERADMINMODERATOR
}model User {id Int id default(autoincrement())name Stringrole Role
}更多数据模型内容可以前往官方文档探索https://www.prisma.io/docs/orm/prisma-schema/data-model
2、Prisma Client 数据交互接口
2.1 概念 Prisma Client 是 Prisma ORM 的主要组成部分它是一个自动生成的数据库查询客户端用于与数据库进行交互。 提供一种类型安全的方式来执行数据库操作简化与数据库的连接和操作。 【Prisma Client API文档】https://www.prisma.io/docs/orm/reference/prisma-client-reference 关键特点
自动生成根据数据库模式schema.prisma 文件自动生成一个类型安全的客户端库(代码)类型安全使用 TypeScript 来生成类型定义这意味着在开发过程中可以获得类型推导和自动补全数据操作无需手动编写原始SQL语法交由Prisma Client 提供的 API 使用 JavaScript/TypeScript 中的类型安全语法完善接口(API)包含CRUD、关联、分页和排序、事务操作等数据库支持 PostgreSQL、MySQL、MariaDB、SQL Server、SQLite、 CockroachDB、MongoDB 各类主流数据库
2.2 使用示例
定义数据库模型schema.prisma
datasource db {provider postgresqlurl env(DATABASE_URL)
}generator client {provider prisma-client-js
}model User {id Int id default(autoincrement())name Stringemail String unique
}模型构建
pnpx prisma generate在代码中使用
import { PrismaClient } from prisma/client;const prisma new PrismaClient();async function main() {const users await prisma.user.findMany();console.log(users);
}main().catch(e {throw e
}).finally(async () {await prisma.$disconnect()
});
3、Prisma Migrate 迁移与种子
3.1 概念 Prisma Migrate 是 Prisma ORM 中用于数据库迁移的工具。 通过自动生成和执行 SQL 迁移脚本来管理数据库结构变化同时确保数据库结构与 Prisma Schema 文件schema.prisma保持一致。 3.2 迁移流程 通常的工作流程包括以下几个步骤
修改 Prisma 模式你在 schema.prisma 文件中修改数据库模型。创建迁移文件运行 prisma migrate dev 或 prisma migrate create 命令自动生成迁移文件。应用迁移通过 prisma migrate deploy 或 prisma migrate dev 将迁移应用到数据库。查看迁移历史Prisma 会在数据库中跟踪迁移历史确保每次迁移都按顺序应用。
3.3 数据库迁移Migrate
3.3 数据种子Seeding
4、Prisma CLI 命令行工具 文档[英]支持指令[英] init
参数默认描述--datasource-providerpostgresql指定块provider中字段的值datasource。选项包括sqlite、postgresql、mysql、和。sqlservermongodbcockroachdb--url定义自定义数据源 URL--with-model在初始 Prisma 模式中添加一个简单的用户模型。自 5.14.0 版起可用。--outputnode_modules/.prisma/client指定生成的客户端的输出位置--generator-providerprisma-client-js定义要使用的生成器提供程序--preview-feature定义要使用的预览功能
示例
pnpx prisma init --datasource-provider PostgreSQLgenerate
参数默认描述--no-engine生成不带附带引擎的 Prisma Client 以与Prisma Accelerate–data-proxy一起使用。与和互斥–accelerate。在 Prisma ORM 5.2.0 及更高版本中可用。--no-hints生成 Prisma Client但不会在终端上打印使用提示。在 Prisma ORM 5.16.0 及更高版本中可用。--allow-no-models将生成 Prisma Client但不生成任何模型--watch监视schema.prisma文件并在文件更改时重新生成 Prisma Client
示例
prisma generate其他的后续再整理补充…
三、Next.js 中应用示例 以Next.js PostgreSQL 组合为例 node环境 nodev20.17.0pnpm9.15.3 1、全新项目示例
1.1 项目初始化
react^19.0.0next15.1.4pg^8.13.1prisma/client^6.2.1
pnpx create-next-applatest// 安装时将看到以下提示
✔ What is your project named? … .
✔ Would you like to use TypeScript? … Yes
✔ Would you like to use ESLint? … Yes
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like your code inside a src/ directory? … No
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to use Turbopack for next dev? … No
✔ Would you like to customize the import alias (/* by default)? … No增加依赖包pg、prisma/client
pnpm add pg prisma/client1.2 初始化Prisma ORM
// 初始化兼容PostgreSQL驱动数据库
pnpx prisma init --datasource-provider PostgreSQL// 将看到以下提示
✔ Your Prisma schema was created at prisma/schema.prismaYou can now open it in your favorite editor.warn You already have a .gitignore file. Dont forget to add .env in it to not commit any private information.Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Run prisma db pull to turn your database schema into a Prisma schema.
3. Run prisma generate to generate the Prisma Client. You can then start querying your database.
4. Tip: Explore how you can extend the ORM with scalable connection pooling, global caching, and real-time database events. Read: https://pris.ly/cli/beyond-ormMore information in our documentation:
https://pris.ly/d/getting-started至此基础环境搞定接下来重点查看编辑两个文件.env和prisma/schema.prisma 在.env文件中重点设置DATABASE_URL的值用于建立数据库连接的配置
DATABASE_URLpostgresql://[username]:[password][ip|domain]:[port|5432]/[database][?param1value1param2value2...]在prisma/schema.prisma文件中对生成器、数据模型进行配置
generator client {provider prisma-client-jsoutput ./client // 配置生成器的代码生成位置(相对schema.prisma文件所在目录)
}datasource db {provider postgresqlurl env(DATABASE_URL)
}// 以下部分均为数据模型构建配置
model User {id Int id default(autoincrement())email String uniquename Stringposts Post[]
}model Post {id Int id default(autoincrement())title Stringcontent Stringpublished Booleanuser User relation(fields: [userId], references: [id])userId Int
}完成以上配置后开始生成Prisma客户端代码
// 生成Prisma客户端
pnpx prisma generate// 将看到以下提示
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma✔ Generated Prisma Client (v6.2.1) to ./prisma/client in 24msStart by importing your Prisma Client (See: https://pris.ly/d/importing-client)Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate1.3 数据迁移
将数据模型推送到数据库中
// 模型推送
pnpx prisma db push// 将看到以下提示
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource db: PostgreSQL database xxxx, schema public at xxxx:5432 Your database is now in sync with your Prisma schema. Done in 6.22s✔ Generated Prisma Client (v6.2.1) to ./prisma/client in 28ms1.4 播种数据可选 添加ts-node和types/node到开发依赖项 pnpm add -D ts-node types/nodePs:非TypeScript项目需要增加typescript依赖包 在prisma目录下创建一个seed.ts文件写入播种数据
// 导入 PrismaClient(注pnpx prisma generate生成的代码)
import { PrismaClient } from ./client// 创建 PrismaClient 实例
const prisma new PrismaClient()// 定义 main 函数
async function main() {// 使用 upsert 方法创建或更新用户const alice await prisma.user.upsert({where: { email: aliceprisma.io },update: {},create: {email: aliceprisma.io,name: Alice,posts: {create: {title: Check out Prisma with Next.js,content: https://www.prisma.io/nextjs,published: true,},},},})// 创建另一个用户const bob await prisma.user.upsert({where: { email: bobprisma.io },update: {},create: {email: bobprisma.io,name: Bob,posts: {create: [{title: Follow Prisma on Twitter,content: https://twitter.com/prisma,published: true,},{title: Follow Nexus on Twitter,content: https://twitter.com/nexusgql,published: true,},],},},})console.log({ alice, bob })
}// 执行 main 函数并处理错误
main().then(async () {await prisma.$disconnect()}).catch(async (e) {console.error(e)await prisma.$disconnect()process.exit(1)})在package.json文件中新增以下配置告诉prisma播种文件所在位置及其他配置信息
{// .....prisma: {seed: ts-node --compiler-options {\module\:\CommonJS\} prisma/seed.ts},// .....
}将种子数据推送上数据库里
// 种子推送
pnpx prisma db seed// 将看到以下提示
Environment variables loaded from .env
Running seed command ts-node --compiler-options {module:CommonJS} prisma/seed.ts ...
{alice: { id: 1, email: aliceprisma.io, name: Alice },bob: { id: 2, email: bobprisma.io, name: Bob }
} The seed command has been executed.1.5 模拟业务 创建一个api接口GET /api/users 用于获取用户表所有数据 1、实例化 Prisma 客户端
在prisma目录创建一个db.ts文件用于实例化
// file/prisma/db.tsimport {PrismaClient} from ./clientconst globalForPrisma globalThis as unknown as { prisma: PrismaClient }export const prisma globalForPrisma.prisma || new PrismaClient()if (process.env.NODE_ENV ! production) globalForPrisma.prisma prismaexport default prisma2、创建数据API接口
use server;import {NextResponse} from next/server
// 导入客户端实例
import prisma from /prisma/dbexport async function GET() {// 使用findMany方法获取user表相关数据const allUsers await prisma.user.findMany();return NextResponse.json({message: Hello World,data: allUsers}, {status: 200});
}3、测试获取是否正常 有何不足之处欢迎评论区或者私信我