首页/文章/数据库

Prisma 的全部命令和 schema 语法

2024-06-22
22158 分钟
...
npx prisma -h

  • init:创建 schema 文件,初始化项目结构。
  • generate:根据 schema 文件生成客户端代码。
  • db:包括数据库与 schema 的同步。
  • migrate:处理数据表结构的迁移。
  • studio:提供图形化界面进行 CRUD 操作。
  • validate:验证 schema 文件的语法。
  • format:格式化 schema 文件。
  • version:显示版本信息。

环境设置与初始化

首先,我们需要创建一个新的项目并设置 Prisma:

mkdir prisma-all-command
cd prisma-all-command
npm init -y
npm install prisma -g
prisma init

初始化与配置

执行 init 命令:

prisma init --datasource-provider mysql

执行后,生成 prisma/schema.prisma.env 文件,配置数据库连接。

修改数据库连接:

  • 可通过修改 .env 文件中的 URL 来更改数据库连接,例如:
prisma init --url mysql://root:password@localhost:3306/prisma_test
  • password:这是连接数据库的密码。在实际使用中,你应该替换成你的实际数据库密码。

数据库与 Schema 同步

拉取数据库结构到 Schema

prisma db pull

此命令将数据库中的表结构同步到 Prisma 的 schema 文件中。
现在连接的 prisma_test 数据库里是有这两个表:

执行 prisma db pull 后:

推送 Schema 更改到数据库

prisma db push

将 schema 文件中的更改推送到数据库,同步表结构。
我们先把表全部删除:

执行 prisma db push 后:

重新生成了这两张表。

数据迁移

创建与应用迁移:

prisma migrate dev --name init

此命令根据 schema 的更改生成 SQL 文件,并执行这些 SQL 来更新数据库结构,同时生成客户端代码。
数据库中的 _prisma_migrations 表记录所有迁移历史,有助于跟踪每次迁移的详细信息:

数据初始化与脚本执行

数据初始化脚本

prisma/seed.ts:

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
	const user = await prisma.user.create({
		data: {
			name: '云牧',
			email: 'xx@xx.com',
			Post: {
				create: [
					{ title: '文章1', content: '内容1' },
					{ title: '文章2', content: '内容2' },
				],
			},
		},
	});
	console.log(user);
}

main();

在 package.json 中添加脚本执行命令:

"prisma": {
    "seed": "npx ts-node prisma/seed.ts"
}

执行命令 prisma db seed 来插入初始数据:

数据正确插入了。

执行 SQL 脚本

写一个 prisma/test.sql:

执行命令:

prisma db execute --file prisma/test.sql --schema prisma/schema.prisma

SQL 脚本执行后,会删除 id 为 2 的文章:

重置数据库

使用 prisma migrate reset 命令可以重置数据库,清空所有数据,并重新执行所有迁移和数据初始化。

代码生成

prisma generate 命令用于根据 schema.prisma 文件生成 Prisma 客户端代码,这些代码位于 node_modules/@prisma/client 目录下,主要用于实现 CRUD 操作。
注意:该命令不会同步数据库结构,仅根据 schema 文件生成客户端代码。

图形界面操作

prisma studio 提供了一个用户友好的图形界面,使得用户可以直接在浏览器中进行数据的增删改查操作:

用户可以通过界面直接编辑、删除或新增数据记录。
一般我更倾向使用如 MySQL Workbench,进行数据库操作。

Schema 验证

prisma validate 命令用于检查 schema.prisma 文件中是否存在语法错误。
安装 Prisma 的 VSCode 插件后,可以在编辑器内直接看到 schema 文件的错误,类似于 ESLint 的功能。

文件格式化

prisma format 命令用于自动格式化 schema.prisma 文件,确保文件的风格一致性和可读性。
安装 Prisma 的 VSCode 插件,直接使用编辑器的格式化功能来格式化 schema 文件,提高开发效率。

版本信息

prisma version 命令用于显示 Prisma CLI 和 Prisma Client 的当前版本信息。这对于调试问题或确保使用的是最新功能非常有用。

初始化项目

首先,创建一个新的项目目录并初始化:

mkdir prisma-schema
cd prisma-schema
npm init -y
npm install prisma -g

在项目目录中执行初始化命令:

prisma init

这将生成 .envschema.prisma 文件。

配置数据库

编辑 .env 文件,设置数据库连接信息:

DATABASE_URL="mysql://root:输入自己的密码@localhost:3306/prisma_test"

schema.prisma 文件中配置数据源和模型:

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

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

生成客户端代码

运行以下命令生成 Prisma 客户端:

prisma generate

客户端代码默认生成在 node_modules/@prisma/client。可以通过修改 schema.prisma 中的 generator 配置来改变输出目录:

generator client {
  provider = "prisma-client-js"
  output   = "../generated/client"
}

重新运行 prisma generate,客户端代码将在指定的目录生成。

数据库迁移

使用以下命令创建和运行迁移:

prisma migrate dev --name init_migration

这会根据模型生成相应的 SQL 文件并执行:

扩展模型和迁移

添加更复杂的模型,例如:

model Test {
  id Int    @id @default(autoincrement()) // 定义一个名为 id 的整数字段,作为主键,且自动递增
  t1 String @db.Text // 定义一个名为 t1 的文本字段,使用数据库的 Text 类型存储
  t2 Int    @map("tt2") @db.TinyInt // 定义一个名为 t2 的整数字段,使用数据库的 TinyInt 类型,实际在数据库中的字段名为 tt2
  t3 String @unique @db.VarChar(50) // 定义一个名为 t3 的字符串字段,限定最大长度为50,且在数据库中该字段值唯一

  @@index([t2, t3]) // 为 t2 和 t3 字段创建一个复合索引
  @@map("test_test") // 指定在数据库中该表的实际名称为 test_test
}

运行迁移:

npx prisma migrate dev --name m1

生成了表:

定义关系

定义一对多和多对多的模型关系:


model Department {
  id        Int       @id @default(autoincrement())  
  name      String    @db.VarChar(20)                
  createTime DateTime @default(now())               
  updateTime DateTime @updatedAt                    
  employees Employee[]                              
}


model Employee {
  id          Int        @id @default(autoincrement())  
  name        String     @db.VarChar(20)                
  phone       String     @db.VarChar(30)                
  departmentId Int                                     
  department  Department @relation(fields: [departmentId], references: [id])  
}


model Post {
  id        Int         @id @default(autoincrement())  
  title     String                                     
  content   String?                                    
  published Boolean     @default(false)                
  tags      TagOnPosts[]                               
}


model Tag {
  id    Int         @id @default(autoincrement())  
  name  String                                     
  posts TagOnPosts[]                               
}


model TagOnPosts {
  post   Post @relation(fields: [postId], references: [id])  
  postId Int                                                
  tag    Tag @relation(fields: [tagId], references: [id])   
  tagId  Int                                                
  @@id([postId, tagId])                                     
}
  • Department 模型:代表一个部门,包含基本信息和与员工的关联。部门可以有多个员工。
  • Employee 模型:代表一个员工,包含基本信息和与部门的关联。每个员工属于一个部门。
  • Post 模型:代表一个帖子,包含标题、内容和发布状态。帖子可以有多个标签。
  • Tag 模型:代表一个标签,可以标记多个帖子。
  • TagOnPosts 模型:是一个中间表模型,用于实现帖子和标签之间的多对多关系。每个记录都包含一个帖子和一个标签的关联。

使用枚举

定义枚举类型并在模型中使用:


enum Role {
  ADMIN, 
  USER,  
  GUEST  
}


model Account {
  id      Int      @id @default(autoincrement()) 
  name    String?  
  role    Role     @default(USER) 
}

生成文档

安装并配置额外的 generator,例如文档:

npm install prisma-docs-generator -D

schema.prisma:

generator docs {
  provider = "node node_modules/prisma-docs-generator"
  output   = "../generated/docs"
}

运行 npx prisma generate 生成文档。

查看生成的文档

使用 HTTP 服务器查看生成的文档:

npx http-server ./generated/docs

文档中会列出所有模型的字段、CRUD 方法及其参数类型等:

总结

generator 部分可以指定多种生成器,比如生成 docs 等,可以指定生成代码的位置。
datasource 是配置数据库的类型和连接 url 的。
model 部分定义和数据库表的对应关系:

  • @id 定义主键
  • @default 定义默认值
  • @map 定义字段在数据库中的名字
  • @db.xx 定义对应的具体类型
  • @updatedAt 定义更新时间的列
  • @unique 添加唯一约束
  • @relation 定义外键引用
  • @@map 定义表在数据库中的名字
  • @@index 定义索引
  • @@id 定义联合主键

此外,还可以通过 enum 来创建枚举类型。
这些就是常用的 schema 语法了。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
数据库2026-04-13
SQLite FTS5 全文搜索引擎详解
FTS5(Full Text Search 5)是 SQLite 内置的 全文搜索扩展 ,让你在不依赖外部搜索引擎(Elasticsearch、Solr)的情况下,用纯 SQL 实现高性能的文本检索。它的 API 比前代 FTS3/FTS4 更清晰,性能更好,是 SQLite 全文搜索的首选方案。 一、FTS5 是什么 简单说: FTS5 让你像查数据库一样搜索文本内容 。 传统 LIKE ‘%关键词%’ 的问题: 每次查询都要扫描全表...
学习
数据库2026-03-18
数据库索引核心原理笔记:从作用机制到底层实现
摘要 :本文系统梳理了数据库索引的核心作用、B+ 树底层原理、聚簇与非聚簇索引的区别,以及索引生效的真实逻辑。重点澄清了“索引查询是否等于全表扫描”的常见误区,并总结了索引设计的最佳实践。 一、索引的核心作用:用空间换时间 索引是数据库提升查询性能的“核武器”,其本质是 通过额外的存储空间和写入代价,换取读取速度的指数级提升 。 1\. 主要收益 加速数据检索 :将时间复杂度从 $O(N)$(全表扫描)降低至 $O(\log N)$(树...
学习
数据库2025-03-05
MySQL 数据库常用命令大全
1\. MySQL命令 MySQL命令是用于与MySQL数据库进行交互和操作的命令。这些命令可以用于各种操作,包括连接到数据库、选择数据库、创建表、插入数据、查询数据、删除数据等。 2\. MySQL基础命令 默认端口号:3306 查看服务器版本:select version(); 或者 cmd命令 mysql verison 登录数据库:mysql uroot p 退出数据库:exit/quit 查看当前系统下的数据库:show da...
学习
数据库2024-11-14
ubuntu 20.04 下安装mysql 8.0.22 并开启远程连接
ubuntu 20.04 下安装mysql 8.0.22 并开启远程连接 前两天想把学校做的数据库作业搬到ubuntu云服务器上去,搞了我好久,踩坑太多了,希望记录一下给遇到同样问题的人 以下所有操作在管理员模式下进行,若不在管理员模式下请在代码前加上sudo 第一步 更新所有软件 第二步 安装mysql 弹出以下提示 第三步完成后登陆数据库 先查看root的host   可以看到root的host为localhost即只有本...
学习
数据库2024-06-22
MySQL常用命令大全
打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入 windows 快捷键 win + R,输入 cmd,直接在 cmd 上输入 1、mysql服务的启动和停止 启动失败可按快捷键 win+R,输入 services.msc,找到MySQL服务器的名称启动 2、登陆mysql 键入命令mysql u root p, 回车后提示你输入密码,然后回车即可进入到mysql中了 3、增加新用户 例:增加一个用户u...
学习
数据库2024-06-20
prisma
prisma : 什么是prisma? 是一个现代的开源数据库工具集,提供了一系列工具来简化数据库操作。主要用于Node.js和TypeScript环境,旨在提供一个强大、灵活且易于使用的数据库访问层 和我们上一章节用到的knex比起来,这是真正企业级的ORM工具。但不管是 还是 都是流行的ORM(对象关系映射)工具 他们两者之间各有优势, 是企业级基本上就代表了没有 那么轻便 但不具备轻便性的同时也拥有了更多强大的功能(更现代、高级别...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录