基于Node.js的ORM框架 Prisma的上手使用
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开发框架来进行服务端接口的开发,更多内容以及查询语句等用法,大家也可以前往以下官网查看对应文档。
英文文档:prisma.io
转载自:https://juejin.cn/post/7081461200860971039