新一代ORM-Prisma
这篇文章主要围绕我个人在开发网站时,使用的 nextjs
+ nodejs
+ prisma
全栈技术,涉及到数据库ORM方面的知识框架Prisma
的上手使用及学习心得
# 简介
✨ 应用开发者应该关心数据 - 而不是 SQL
适用于 Node.js
、TypeScript
、Go
的新一代数据库 ORM(ORM
全称为 Object relational mappers
对象关系映射),支持PostgreSQL
、MySQL
、MongoDB
、SQL Server
和SQLite
数据库,它由三个主要工具组成:
- Prisma Client:自动生成的类型安全的查询构建器
- Prisma Migrate:强大的数据建模和迁移系统
- Prisma Studio:用于查看和编辑数据库中数据的 GUI
这些工具旨在提高应用程序开发人员在其数据库工作流中的工作效率。Prisma 的最大好处之一是它提供的抽象级别:应用程序开发人员在使用 Prisma 时可以以更直观的方式推理他们的数据,而不是弄清楚复杂的 SQL 查询或模式迁移。
Prisma 是 TypeScript 生态中唯一一个 彻底 的类型安全 ORM。生成的 Prisma Cient 会确保查询结果的类型化,甚至是针对部分查询和关联。
同类型的ORM库还有:
# 数据库的分类
关系型数据库(Relational databases):数据通常是规范化的(扁平化的),然后通过外键来连接各实体。然后这些实体需要被连接(JOIN)起来,以体现实际的关联关系。
面向对象(Object-oriented):对象可以是深度嵌套的结构,你可以通过点号(.)简单的遍历关联关系。
# Prisma的定位及作用
与关系型数据库打交道,是应用程序开发中的一个主要瓶颈。调式 SQL 查询或复杂的 ORM 对象经常消耗数小时的开发时间。
Prisma 的主要目标是使应用开发人员在使用数据库时更具有生产力。再考虑生产力和可控性之间的平衡,这就是 Prisma 的作用。
# 初探
# 安装开发
创建项目目录:
mkdir prisma-app
进入项目目录:
cd prisma-app
初始化仓库:
npm init -y
安装依赖:
npm install prisma typescript ts-node @types/node --save-dev
创建
tsconfig.json
文件{ "compilerOptions": { "sourceMap": true, "outDir": "dist", "strict": true, "lib": ["esnext"], "esModuleInterop": true } }
1
2
3
4
5
6
7
8
9初始化Prisma:
npx prisma init
这个命令创建了一个名为prisma的新目录,其中包含一个名为schema.prisma的文件和一个位于项目根目录中的.env文件schema.prisma包含prisma模式以及数据库连接和prisma客户端生成器。 .env是一个dotenv用于定义环境变量的文件(用于数据库连接)。
链接数据库
具体写法和含义见文档
prisma/schema.prisma
datasource db { provider = "postgresql" url = env("DATABASE_URL") }
1
2
3
4如果是 SQlite就简单多了,直接连接本地SQlite文件,可以这样写
datasource db { provider = "sqlite" url = "file:./dev.db" }
1
2
3
4
5.env
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
1
# 声明式的 scheme
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
age Int?
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
npx prisma migrate dev
该模型定义了数据库User模型,id为默认主key,自增
schema.prisma
文件描述了SQLite数据库中的表的User
模型。
由于 SQLite的特性(是个本地文件),这里推荐使用 SQLite文件的形式去操作链接数据库,进行CURD
操作练习
官方有提供相应的 VsCode 插件 - Prisma,极大地方便快速上手
# CURD 操作
- create
import { PrismaClient } from "@prisma/client";
// 实例化
const prisma = new PrismaClient()
// 创建一个新的user数据
const result = await prisma.post.create({
data: {
name: 'sssgoEasy',
email: 'sss213018@163.com',
age: 12
},
})
2
3
4
5
6
7
8
9
10
11
12
13
- Retrieve
// 查找所有 age 为12的user
const result = await prisma.post.findMany({
include: { age: 12 }
})
2
3
4