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
