首页 > 其他分享 >Prisma - 入门

Prisma - 入门

时间:2023-08-21 19:45:26浏览次数:42  
标签:Prisma 入门 数据库 prisma Client env schema

Prisma是一个开源的数据库工具链项目,支持PostgreSQL、MySQL、MongoDB、SQL Server和SQLite。下面我会使用Mysql + Typescript来作为演示。

安装Prisma

首选你需要有一个Node环境。然后新建一个文件夹,初始化Node项目。

npm init -y
npm i typescript ts-node --save-dev
npm i prisma --save-dev

初始化Prisma

npx prisma init

prisma会创建.env(环境变量)和prisma/schema.prisma(Prisma schema)

配置数据库

打开prisma/schema.prisma,修改数据库的provider为mysql

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

可以看到,这里的数据库地址使用了.env里的DATABASE_URL变量,我们去.env中修改一下。格式为mysql://username:password@ip:port/database

数据建模

术语 数据建模(data modeling) 是指 定义应用程序中对象的形状和结构的过程,这些对象通常被称为 "应用模型(application models)"。在关系型数据库中(例如 PostgreSQL),它们被存储在 表(tables) 中。当使用文档数据库(如 MongoDB)时,它们被存储在 集合(collections) 中。

在Mysql中,说白了就是搞一下表结构。打开Prisma schema(prisma/schema.prisma),添加下面代码:

model User {
  user_id Int     @id @default(autoincrement())
  name    String?
  email   String  @unique
  isAdmin Boolean @default(false)
}

这就代表有一张User表,有user_idnameemailisAdmin等字段。这有什么用,后面细说。

工作流程

有两种工作流程。使用Prisma Migrate + Prisma Client仅使用Prisma Client

  • 仅使用 Prisma Client:Prisma schema 中的应用模型是通过对你的数据库 schema 进行内省(introspection)来生成的。数据建模主要发生在数据库层面。
  • 使用 Prisma Client 和 Prisma Migrate:数据建模发生在 Prisma schema 中,通过 手动添加应用模型 来实现。Prisma Migrate 映射这些应用模型到底层数据库的数据表(目前仅支持关系型数据库)

Prisma Migrate

Prisma Migrate 是一个命令式数据库架构迁移工具,它可以:

  • 保持数据库架构与Prisma 架构的同步
  • 维护数据库中的现有数据

因此在刚刚数据建模后,你可以使用Prisma Migrate让数据库架构与Prisma架构保持同步。你可以使用prisma migrate dev来创建一个迁移,使用--name xxx的参数来指定本次迁移的名称。

prisma migrate dev --name init

使用上面命令,创建第一次迁移。这会为你做两件事,创建sql文件和执行sql文件。
你可以在migrations文件夹看到迁移历史记录。

如果一切顺利的话,现在数据库中就已经有了User表和对应的字段了。如果报错了,接着往下看。

影子数据库

这里有一个坑,Prisma Migrate 在运行以开发为中心的命令时会使用第二个临时数据库,例如:

prisma migrate dev
prisma migrate reset

这个数据库被称为影子数据库。但是有些人使用的云数据库可能没有权限创建数据库,然后就报错了。有两种解决方法,一种是给权限,另一种是再使用另一个数据库作为影子数据库。

这里说一下如何设定影子数据库,首选创建一个数据库作为影子数据库。然后在数据库的配置中加入shadowDatabaseUrl字段。

datasource db {
  provider          = "postgresql"
  url               = env("DATABASE_URL")
  shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
}

我这里依然使用了env,在.env中再添加一个SHADOW_DATABASE_URL,并配置影子数据库的url即可。

影子数据库用户权限

数据库 数据库用户需求
SQLite 没有特殊要求。
MySQL 数据库用户必须具有 CREATE, ALTER, DROP, REFERENCES ON . 权限。
PostgreSQL 用户必须是超级用户或具有 CREATEDB 权限。请参见 CREATE ROLE (PostgreSQL 官方文档)。
SQL Server 用户必须是站点管理员或具有 SERVER 安全权限。请参见官方文档。

Prisma Client

Prisma Client 是一个自动生成的类型安全查询构造器。
我们只需要import { PrismaClient } from '@prisma/client',然后const prisma = new PrismaClient()即可,这会创建一个Prisma Client实例。如果这里报错,检查一下有没有安装@prisma/client
当你安装@prisma/client时,他会自动执行prisma generate,因此首次并不需要执行prisma generate
但是如果你修改了数据库结构, Prisma schema 被更改时,你需要手动执行一次npx prisma generate。当prisma generate执行后,这个命令读取你的Prisma模式并生成你的Prisma Client库。(这使得你的Prisma Client实例拥有刚刚数据建模中的数据模型)。

然后我们就可以通过Prisma Client访问这些数据模型,并对数据进行操作。

使用Prisma客户端编写第一个查询

创建一个名为的新文件index.ts并向其添加以下代码:

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
  // ... 在这里写一些查询
}

main()
  .catch((e) => {
    throw e
  })
  .finally(async () => {
    await prisma.$disconnect()
  })

因为目前数据库中没有数据,所以先写一些数据进去:

async function main() {
  await prisma.user.create({
    data: {
      name: '二次元虎哥',
      email: '[email protected]',
      isAdmin: false
    },
  })

然后npx ts-node index.ts执行。然后修改为查询代码:

async function main() {
  const allUsers = await prisma.user.findMany()
  console.log(allUsers)
}

然后执行文件,不出意外的话就可以看到刚刚写入的数据了。

然后试试更新数据:

async function main() {
  const user = await prisma.user.update({
    where: { name: "二次元虎哥" },
    data: { isAdmin: true },
  })
  console.log(user)
}

返回更新后的数据就说明更新成功了。上面提到的create,update和findMany只是Client的一部分Api。我会在后面的笔记中详细介绍其他Api。

标签:Prisma,入门,数据库,prisma,Client,env,schema
From: https://www.cnblogs.com/orzmiku/p/17646882.html

相关文章

  • Java入门
    Java特性和优势简单性面向对象可移植性writeonce,runanywhereJVM虚拟机跨平台高性能效率高分布式 动态性反射机制多线程一边一边安全性不会使程序崩溃健壮性Java三大版本JavaSE:标准版(桌面程序扫雷连连看,控制台开发)JavaME:不用了JavaEE:企业级开发(web端,......
  • RabbitMQ的学习之快速入门
    快速入门:使用springboot整合springAmqp来创建队列和消息同时创建consumer接收发送的消息第一步:引入依赖,在父类中引入spring-boot-starter-amqp依赖第二步:在yml中建立连接 第三步:创建publisher测试类引入注解,利用 RabbitTemplate生成对象调用方法,这样publisher就创建......
  • renpy入门(三)
    renpy入门L3角色与图像角色:用Character()类定义的角色指定:what_:对话框属性who_:人物名属性属性:size:文本大小volor:颜色outlines:外边框[(宽度,颜色,x偏移,y偏移)]font:字体prefix:前缀suffix:后缀image:图像window_background:背景框bold:粗体,接布尔类型数值de......
  • Postgres入门:三种免费且简单的方法
    大家好,开发者们!今年大约有9万人参与了StackOverflow的调查。令人印象深刻的是,Postgres被评为第一数据库。此外,DBEngines还将PostgreSQL列为全球增长最快的数据库之一。这对我们意味着什么呢?很明显,我们应该努力成为PostgreSQL专家。朝这个方向迈出的一个重要步骤是设置我们自己的......
  • MATLAB入门小操作(数据类型)
    这是一篇有助于快速上手MATLAB软件的文章(新手向)。(学习过其他的语言更容易看懂)数据类型这篇文章我想从MATLAB中的数据类型出发去列举一些经常使用的操作。MATLAB中的数据类型包括其他语言中常见的如:数字字符与字符串结构体还有一些特有的数据类型如:矩阵元胞数组下文将......
  • 2.1 入门实践-一张普通报表
    一、普通报表1.概述1.1报表设计流程图1.2报表设计案例目标这张报表由三部分构成:参数面板:通过下拉框控件选择地区,查询出对应地区的数据。表格:表格统计该地区下各销售员每个产品的销量。柱形图:柱形图将表格中的数据以图表的形式进行展示。2.制作步骤2.1新建......
  • CGAL入门——凸壳算法
    一、凸壳算法凸壳是能包含点集合的最小凸多边形,即凸壳是点集合的一个子集,将这个子集的点连接起来可以包含点集中所有的点。 二、数组中点的凸壳#include<iostream>#include<CGAL/Exact_predicates_inexact_constructions_kernel.h>#include<CGAL/convex_hull_2.h>......
  • 【人工智能】机器学习入门之监督学习(一)有监督学习
    机器学习入门之监督学习(一)有监督学习简介监督学习算法是常见算法之一,主要分为有监督学习和无监督学习。本文主要记录了有监督学习中的分类算法和回归算法,其中回归算法是最主要内容。本笔记对应视频:阿里云开发者社区学习中心-人工智能学习路线-阶段1:机器学习概览及常见算法对应......
  • 【人工智能】深度学习框架值TF入门-模型保存与加载
    资料:https://tensorflow.google.cn/tutorials/keras/save_and_load#选项Keras的方式Keras版本模型保存与加载函数保存模型权重:model.save_weights保存HDF5文件:model.save保存pb文件:tf.saved_modeltf.saved_model和model.save的区别在于,tf.saved_model格式的模型可以直接......
  • Jmeter 接口测试工具入门
    1)Jmeter介绍JMeter是一款JAVA桌面应用程序,常常被用来做接口测试、负载测试等等JMeter是一款开源测试工具:开源免费软件,不需要任何使用费用小巧绿色,相比LoadRunner的庞大,它非常小巧并且不需要安装(需要安装JDK)功能强大,设计之初只是一个简单的性能测试工具,经过无数次更......