zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于Node.js的ORM框架 Prisma的上手使用

JSNode框架 基于 ORM 使用
2023-09-14 09:02:36 时间

Node.js作为我们前端的一项技术,大多数时间是作为一个Javascript的运行环境而存在。但是其优秀的异步操作以及非阻塞式的程序运行方式,也让Node.js能够同时并发处理数千个连接。前端工程师可以用很低的学习成本来使用它完成常用的服务端代码。

ORM

ORM:对象关系映射(Object Relational Mapping)是一种程序设计技术。简单来说ORM可以将我们的底层数据库的各种操作进行一定的封装,我们就可以通过更加熟悉的开发语言来书写对应的数据库命令,ORM则可以将这些数据库操作命令转换为对应的SQL语句。那么我们本次所要了解的就是Prisma

Prisma

下一代 Node.js、TypeScript、Go 的数据库 ORM

Prisma是一个开源的数据库工具链项目,帮助开发人员更快地构建应用程序并减少错误,支持PostgreSQL、MySQL、MongoDB、SQL Server和SQLite。

如果想要了解一门技术的用法,那么我们则需要通过实际的上手使用它来进行一点点的开发。

  • · 首先我们需要初始化一个项目

mkdir prisma-demo # 创建一个目录
cd prisma-demo # 通过命令行来进入该项目目录
npm init -y # 将项目进行初始化
{
  "name": "prisma-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
  • · 然后我们将本次所需要使用的prisma进行安装一下

    npm install prisma -D # 安装prisma
    
  • · 安装完成后,我们可以通过npx prisma init -h命令来查看prisma相关的命令帮助信息

  • Setup a new Prisma project
    
    Usage
    
      $ prisma init [options]
    Options
    
               -h, --help   Display this help message
    --datasource-provider   Define the datasource provider to use: PostgreSQL, MySQL, SQLite, SQL Server or MongoDB (Preview)
                    --url   Define a custom datasource url
    
    Examples
    
    Setup a new Prisma project with PostgreSQL (default)
    # 默认连接的数据库为PostgreSQL的数据库
      $ prisma init
    # 初始化prisma
    Setup a new Prisma project and specify MySQL as the datasource provider to use
      $ prisma init --datasource-provider mysql
    # 可以通过该命令来定义连接的数据库类型
    Setup a new Prisma project and specify the url that will be used
      $ prisma init --url mysql://user:password@localhost:3306/mydb

  •  · 在此处我们通过使用prisma init --datasource-provider sqlite来定义默认的数据库为SQLite

    • SQLite是一个文件数据库,自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎,在使用过程中较为方便。
    npx prisma init --datasource-provider sqlite # 配置默认数据库为sqlite
    
  •   · 来到我们的代码界面

    // prisma -> schema.prisma 
    // 本文件为数据库模型的配置文件 所有数据库模型的配置都在此文件
    generator client {
      provider = "prisma-client-js"
    }
    
    // 数据源
    datasource db {
      provider = "sqlite"  
      // 数据库
      url      = env("DATABASE_URL")
      // 数据库的连接地址
    }
    // 如果需要在VScode中高亮显示代码提示 则需要安装名为 Prisma 的语法插件
  •   · 创建数据模型

    // 用户的数据模型
    model user {
      id        String   @id @unique @default(uuid())
      // 用户ID                不能重复  默认为UUID
      userName  String   @unique @map("user_name")
      // 用户名           不能重复 @map表示为字段定义别名
      password  String   @default("")
      phone     Int?     @unique
      // 手机号
      nickName  String?  @default("一个不愿意透漏姓名的大佬") @map("nickName")
      // 昵称
      address   String?  @default("")
      // 地址
      gender    String?  @default("")
      // 性别
      createAt  DateTime @default(now()) @map("create_at")
      // 创建时间
      updateAt  DateTime @updatedAt @map("update_at")
      // 更新时间
      autograph String   @default("")
      // 个性签名	
      @@map("users")
      // 给数据表进行命名
    }
    
    // 文件模型
    model post {
      id        String   @id @unique @default(uuid())
      // 建立表的关联关系
      authorId  String   @default("") @map("author_id")
      // 作者ID 关联用户的ID
      @@map("posts")
    }
    
    

         · 数据模型新建完毕后,我们回到我们的命令行中,通过使用npx prisma db push可以在当前文件下直接生成数据库

- node_modules
- prisma
	- dev.db
	-schema.prisma
- .env 
- app.js

  • 我们生成的文件数据库正常情况下无法打开,需要安装VScode中另外的插件 SQLite即可正常的打开我们的文件数据库
  • 除了以上安装插件的方法以外,我们也可以在项目目录中使用npx prisma studio 命令来打开prisma内置的服务器在浏览器端查看我们的数据库以及数据表

  • 数据库的操作

  • 接下来则是数据库的相关操作

  • · 在根目录创建db.js文件,并且进行相应内容的引入

  • import { PrismaClient } from '@prisma/client'
     // 引入 prismaClient 
    const db = new PrismaClient();
    
    db.$connect().catch((err) => console.error(err));
    // 进行数据库的连接
    
    export default db
  • · 创建控制器

    // userController.js
    import prisma from "../utils/db";
    // 引入数据库的连接服务
    async function createUser() {
      // 创建用户
      try {
        await prisma.user.create({
          // 调用prisma的创建功能
          data: {
            userName:'test',
            password:'test',
            nickName:'一个不愿意透漏姓名的大佬'
          },
        });
      } catch (err) {
        // 异常捕获
        console.log(err);
      }
    }
    // 调用创建用户的方法
    createUser()
    
  • · 通过在命令行中执行node userController.js本文件 即可创建一个用户名为test 密码为test的用户

  • · 接下来我们可以通过prisma的查找语句来进行查询用户数据

  • async function findUsers(userName){
      const findUser = await prisma.user.findMany({
        where:userName
      })
      console.log(findUser)
    }
    findUsers('test') 
    /*
     # node userController.js
    	[
        {
    				id:'xxxxxxxx',
    				userName:'test',
    				password:'test',
    				nickName:'一个不愿透漏姓名的大佬',
    				createAt:2022-03-11T04:05:43.175Z,
    				updateAt:2022-03-11T04:05:43.175Z
        }
    	]
    */ 
    
  •   · 除了这些以外我们在数据库操作中经常会有多表关联的情况,那么我们就需要在数据模型中进行相应的配置

  • model user {
      id        String   @id @unique @default(uuid())
      ......
      // 个性签名
      // @@map为数据表定义名字
    + post      post[]
    // 生成两个表的关联关系
      @@map("users")
    }
    
    
    model post {
      id        String   @id @unique @default(uuid())
      // 建立表的关联关系
    + author    user     @relation(fields: [authorId], references: [id])
    + // fields 表示当前模型中的字段  references表示需要关联的模型中的字段
      authorId  String   @default("") @map("author_id")
      // 作者ID 关联用户的ID
      .....
      @@map("posts")
    }
    
  • · 更新完数据库相关的数据模型后则需要重新生成数据库以及数据表

  • npx prisma db push
  • · 然后我们依据上方创建用户的操作,添加一个创建文章的方法

    async function createPost(){
    	const user = await prisma.user.findFirst(); // 查找第一个用户
      await prisma.post.create({
      // 调用创建文章内容的方法  
        data:{
          title:'xxx',
          desc:'xxx',
          authorId:user.id
          //填写进去相应的数据
        }
      })
    }
    createPost()
    // node createPost.js 执行该文件以及方法
    
  • · 生成文章后我们可以再添加一个查找文章的方法

    async function findPost(){
      const post = await prisma.post.findMany({
        where:{}
      })
      console.log(post)
      /*
      	[
      		{
      			id:'xxx',
      			title:'xxx',
      			desc:'',
      			content:'',
      			...
      		},
      		{
      			id:'xxx',
      			title:'xxxx',
      			desc:'xxx',
      			content:'xxxx',
      			...
      		}
      	]
      */
    }
    findPost()
    
  • · 以上为创建文章以及查找文章,如果我们需要查找文章并且需要知道关联数据则可以通过如下方法

    async function findPost(){
      const post = await prisma.post.findMany({
        // where为限制条件
        where:{},
     +  include:{
     +    author: true
     +  }
      })
      console.log(post)
      /*
       [
      		{
      			id:'xxx',
      			title:'xxx',
      			desc:'',
      			content:'',
      			...
     +			author:{
     + 				id:'xxx',
     + 				userName:'xxx',
     + 				password:'xxxx',
     + 				...
     + 			}
      		},
      	]
      */
    }
    findPost()
    
  • 以上为本次Prisma的上手使用,ORM也可以搭配Express.js、Koa.js、Egg.js等Web开发框架来进行服务端接口的开发,更多内容以及查询语句等用法,大家也可以前往以下官网查看对应文档。

英文文档:https://prisma.io

中文文档:https://prisma.yoga/reference/api-reference/prisma-client-reference

*获取千锋教育学习视频资料+源码笔记 ,进学习交流群

请添加下方微信(备注CSDN推荐)