Prisma是可以透過 JavaScript 或是 TypeScript 進行資料庫操作的開源工具,
易於使用 且 具有高效的查詢性能。
簡介
支援 PostgreSQL、MySQL、MongoDB、SQLite等。
可透過 npm 或 Docker 進行安裝。
它使用 GraphQL 來定義資料模型,並生成對資料庫的 CRUD 操作,並可做資料表關聯。
可撰寫 Migrate、Seeder。
提供 GUI 操作介面。
1. 安裝NPM
# npm初始化 npm init -y # 安裝TypeScript npm install typescript ts-node @types/node --save-dev npx tsc --init # 安裝Prisma CLI npm install prisma --save-dev # 安裝Prisma Client npm install @prisma/client ### 可為IDE(VS Code),可安裝Prisma套件
2. 設置環境 schema.prisma
Prisma的介面是透過撰寫Schema或依原有資料庫自動生成Prisma Client後,提供CRUD功能!
##### Prisma初始化 npx prisma init ##### 編輯schema.prisma ### 當用CLI執行 prisma generate 時,生成 Prisma Client時使用的模板。 generator client { provider = "prisma-client-js" } ### 依需求設定 # https://www.prisma.io/docs/reference/database-reference/connection-urls datasource db { provider = "mysql" url = env("DATABASE_URL") }
3-1. 撰寫Schema
### 設定 Model ## 關聯 [] ## 選填 ? ## Int,String,Boolean,Float還有 DateTime ## @id 主鍵 ## @unique 唯一值 ## @default 預設值,可搭配如下: # @default(autoincrement()) # @default(now()) # @defalut(true) ## @relation 定義關聯 model User { id Int @id @default(autoincrement()) type String @db.VarChar(10) tel String @db.VarChar(20) @unique password String? @db.VarChar(255) created_at DateTime @default(now()) updated_at DateTime? @updatedAt orders Order[] } model Order { id Int @id @default(autoincrement()) user_id Int user User @relation(fields: [user_id], references: [id]) content Json @db.Json remark String? @db.VarChar(100) amount Decimal @db.Decimal(6,0) created_at DateTime @default(now()) } ## 多對多範例: 自動生成多對多資料表 model Post { id Int @id @default(autoincrement()) comments Comment[] } model Comment { id Int @id @default(autoincrement()) posts Post[] } ## 多對多: 自訂生成多對多資料表 model CommentsOnPosts { post Post @relation(fields: [post_id], references: [id]) post_id Int comment Comment @relation(fields: [comment_id], references: [id]) comment_id Int assigned_at DateTime @default(now()) assigned_by String @@id([post_id, comment_id]) }
3-2. 依已存在資料庫生成Schema
npx prisma db pull # 檢查Schema邏輯
4. 生成migrate / 遷移 / 退回
## (實驗性功能) 生成migrate npx prisma migrate save --name init --experimental ## (實驗性功能) migrate遷移 至最新 npx prisma migrate up --experimental ## (實驗性功能) migrate遷移 2個階段 npx prisma migrate up 2 --experimental ## (實驗性功能) migrate回退 2個階段 prisma migrate down 2 --experimental ## 生成migrate並遷移 npx prisma migrate dev --name init ## 用於關聯資料庫,檢查Schema與DB之間的差異後,生成資料庫遷移,並將其套用到資料庫 npx prisma db push ## 解析Schema並生成Prisma Client npx prisma generate
5. 生成Prisma Client
## 解析Schema並生成Prisma Client npx prisma generate
Prisma Client – GUI
npx prisma studio
6. 建立Seeder
## prisma/seeder.ts const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient() const menu = [ { title: '海鮮粥', price: '100', is_published: true, is_purchased: true }, { title: '廣東粥', price: '100', is_published: true, is_purchased: false } ] async function main() { await prisma.user.deleteMany() await prisma.product.deleteMany() await prisma.setting.deleteMany() const user = await prisma.user.create({ data: { type: 'admin', name: '管理員', email: '[email protected]', password: '1234' } }) const product = await prisma.product.createMany({ data: menu }) console.log({ user, product }) } main() .then(async () => { await prisma.$disconnect() }) .catch(async (e) => { console.error(e) await prisma.$disconnect() process.exit(1) }) ## work node ./prisma/seeder.ts
## package.json add scripts
"seeder": "node ./prisma/seeder.ts",
## run
npm run seeder