小帅の技术博客 小帅の技术博客
首页
  • 基础
  • 框架
  • 进阶
  • 工程化
  • NodeJS
  • 脚本
  • 拓展
  • 技术
  • 服务器
程序猿
关于
友链
  • 分类
  • 标签
  • 归档
GitHub

前端小帅

学而不思则罔,思而不学则殆
首页
  • 基础
  • 框架
  • 进阶
  • 工程化
  • NodeJS
  • 脚本
  • 拓展
  • 技术
  • 服务器
程序猿
关于
友链
  • 分类
  • 标签
  • 归档
GitHub
  • NodeJs

    • puppeteer无头浏览器
    • 新一代ORM-Prisma
      • 简介
        • 数据库的分类
        • Prisma的定位及作用
      • 初探
      • 安装开发
        • 声明式的 scheme
        • CURD 操作
      • 参考
    • NodeJs获取照片信息并分类
    • 微信每天给女朋友发早安
    • Koa之洋葱模型分析
  • 脚本

  • 拓展

  • 技术

  • 服务器

  • 全栈
  • NodeJs
sunss
2021-10-27

新一代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库还有:

  • Mongoose
  • Sequelize
  • TypeORM

# 数据库的分类

  • 关系型数据库(Relational databases):数据通常是规范化的(扁平化的),然后通过外键来连接各实体。然后这些实体需要被连接(JOIN)起来,以体现实际的关联关系。

  • 面向对象(Object-oriented):对象可以是深度嵌套的结构,你可以通过点号(.)简单的遍历关联关系。

# Prisma的定位及作用

与关系型数据库打交道,是应用程序开发中的一个主要瓶颈。调式 SQL 查询或复杂的 ORM 对象经常消耗数小时的开发时间。

Prisma 的主要目标是使应用开发人员在使用数据库时更具有生产力。再考虑生产力和可控性之间的平衡,这就是 Prisma 的作用。

prisma

# 初探

# 安装开发

  1. 创建项目目录:mkdir prisma-app

  2. 进入项目目录:cd prisma-app

  3. 初始化仓库:npm init -y

  4. 安装依赖:npm install prisma typescript ts-node @types/node --save-dev

  5. 创建tsconfig.json文件

    {
      "compilerOptions": {
        "sourceMap": true,
        "outDir": "dist",
        "strict": true,
        "lib": ["esnext"],
        "esModuleInterop": true
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  6. 初始化Prisma:npx prisma init

    这个命令创建了一个名为prisma的新目录,其中包含一个名为schema.prisma的文件和一个位于项目根目录中的.env文件schema.prisma包含prisma模式以及数据库连接和prisma客户端生成器。 .env是一个dotenv用于定义环境变量的文件(用于数据库连接)。

  7. 链接数据库

    具体写法和含义见文档

    • 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?
}
1
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
  },
})
1
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 }
})
1
2
3
4

# 参考

  • prisma
  • prisma-examples
  • Node.js ORM 框架对比
  • NestJS 中文文档
  • 如何使用 Prisma 和 PostgreSQL 构建 REST API
编辑
上次更新: 2024/04/15, 14:35:14
puppeteer无头浏览器
NodeJs获取照片信息并分类

← puppeteer无头浏览器 NodeJs获取照片信息并分类→

最近更新
01
说说call、apply、bind是如何改变this的
03-29
02
从输入 URL 到页面加载完成发生了什么?
03-29
03
JavaScript进阶—— new 的执行过程
03-26
更多文章>
sunss | © 2020.08-2024.04 浙ICP备2022002957号-1
载入天数... 载入时分秒...  |  总访问量 次
提供CDN加速/云存储服务
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式