【Prisma】JavaScript 的資料庫工具 安裝 / 撰寫Schema / Migrate / Seeder

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