8.0 KiB
8.0 KiB
Prisma 7 — คู่มือการเชื่อมต่อและทำ Seed (ไม่งงอีกต่อไป)
Platform engineering guide: Any HomAroma seed data in this guide is reference-tenant data. Validate the target tenant database and seed strategy before use.
xx
สำคัญมาก: Prisma 7 เปลี่ยนวิธีการเชื่อมต่อฐานข้อมูลอย่างพื้นฐาน
ถ้าเคยใช้ Prisma 4, 5, หรือ 6 มาก่อน — ของเก่าพวกนั้น ใช้ไม่ได้อีกแล้ว
1. สิ่งที่เปลี่ยนไปจาก Prisma 6fdss → Prisma 7
| เรื่อง | Prisma 5/6 (เก่า) | Prisma 7 (ใหม่) |
|---|---|---|
DATABASE_URL ใน schema.prisma |
✅ ใช้ได้ | ❌ ใช้ไม่ได้ |
new PrismaClient() ไม่มี options |
✅ อ่าน .env เอง |
❌ Error ทันที |
| Config ฐานข้อมูล | อยู่ใน schema.prisma |
ย้ายไปที่ prisma.config.ts |
| วิธีเชื่อมต่อ | ผ่าน URL ใน .env |
ผ่าน Driver Adapter |
2. โครงสร้างไฟล์ที่ถูกต้องสำหรับ Prisma 7
apps/backend/
├── prisma/
│ ├── schema.prisma # Models เท่านั้น — ห้ามใส่ url ใน datasource
│ ├── seed.js # Seed file (ใช้ .js ไม่ใช่ .ts เพื่อหลีกเลี่ยง ts-node issues)
│ └── migrations/ # Migration files
├── prisma.config.ts # ← จุดตั้งค่าหลักของ Prisma 7
├── .env # DATABASE_URL อยู่ที่นี่
└── package.json
3. schema.prisma — ห้ามใส่ url
// ✅ CORRECT — Prisma 7
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
// ❌ ห้ามใส่บรรทัดนี้: url = env("DATABASE_URL")
}
model Scent {
id Int @id @default(autoincrement())
name String
size String?
sku String? @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
4. prisma.config.ts — ไฟล์หลักของ Prisma 7
import "dotenv/config";
import { defineConfig } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
seed: "node prisma/seed.js", // ← ชี้ไปที่ seed.js (ไม่ใช่ seed.ts)
},
datasource: {
url: process.env["DATABASE_URL"], // ← URL อยู่ที่นี่แทน schema.prisma
},
});
5. seed.js — Template ที่ใช้งานได้จริง
ทำไมใช้
.jsไม่ใช่.ts:ts-nodeใน environment นี้ไม่แสดง output ทำให้ debug ยาก ใช้.jsแทนเพื่อความเสถียร
// seed.js — CommonJS format
const path = require('path');
// โหลด .env ก่อนทุกอย่าง
require('dotenv').config({ path: path.join(__dirname, '../.env') });
const { PrismaClient } = require('@prisma/client');
const { PrismaPg } = require('@prisma/adapter-pg'); // ← จำเป็นสำหรับ Prisma 7
// ✅ วิธีเดียวที่ถูกต้องใน Prisma 7 — ต้องส่ง adapter เข้าไป
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
const data = [
// ใส่ข้อมูลที่ต้องการ seed ที่นี่
{ name: 'ตัวอย่าง', size: '120ml', sku: '120-ตัวอย่าง-120ml' },
];
async function main() {
process.stdout.write('🚀 Starting seeding...\n');
for (const item of data) {
await prisma.scent.upsert({
where: { sku: item.sku }, // ← ใช้ unique field
update: {}, // ← ถ้ามีอยู่แล้วไม่ต้อง update
create: item,
});
process.stdout.write(`✅ ${item.name} (${item.size})\n`);
}
process.stdout.write(`✨ Done! Total: ${data.length} records\n`);
}
main()
.catch((e) => {
process.stderr.write(`❌ Error: ${e.message}\n`);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
6. Packages ที่ต้อง Install
# Dependencies หลัก
npm i @prisma/client @prisma/adapter-pg pg
# Dev dependencies
npm i -D prisma dotenv
ต่างจากเดิม: Prisma 7 ต้องการ
@prisma/adapter-pgด้วย — ขาดไม่ได้!
7. วิธีรัน Seed
# วิธีที่ 1: รันตรงๆ (แนะนำสำหรับ debug)
cd apps/backend
node prisma/seed.js
# วิธีที่ 2: ผ่าน Prisma CLI (ต้องตั้งค่าใน prisma.config.ts แล้ว)
cd apps/backend
npx prisma db seed
8. Error ที่พบบ่อยและวิธีแก้
❌ Error: url is no longer supported in schema files
The datasource property `url` is no longer supported in schema files.
แก้: ลบ url = env("DATABASE_URL") ออกจาก schema.prisma
ย้ายไปใส่: prisma.config.ts → datasource.url
❌ Error: PrismaClient needs to be constructed with a non-empty, valid PrismaClientOptions
PrismaClientInitializationError: `PrismaClient` needs to be constructed with...
แก้: ต้องส่ง adapter เข้าไปใน constructor เสมอ
// ❌ ผิด
const prisma = new PrismaClient();
// ✅ ถูก
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
❌ Error: Unknown property datasourceUrl provided to PrismaClient constructor
PrismaClientConstructorValidationError: Unknown property datasourceUrl...
แก้: Prisma 7 ไม่รับ datasourceUrl แล้ว ต้องใช้ adapter แทน
// ❌ ผิด (เคยใช้ได้ใน Prisma 6)
const prisma = new PrismaClient({ datasourceUrl: process.env.DATABASE_URL });
// ✅ ถูก
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
❌ Error: ⚠️ No seed command configured
⚠️ No seed command configured
แก้: เพิ่ม seed ใน prisma.config.ts (ไม่ใช่แค่ใน package.json อีกต่อไป)
migrations: {
path: "prisma/migrations",
seed: "node prisma/seed.js", // ← ต้องมีบรรทัดนี้
},
9. Checklist ก่อนทำ Seed ทุกครั้ง
□ 1. schema.prisma → datasource ไม่มี url
□ 2. prisma.config.ts → datasource.url ตั้งค่าไว้
□ 3. prisma.config.ts → migrations.seed ชี้ถูก
□ 4. .env มี DATABASE_URL ครบถ้วน
□ 5. ติดตั้ง @prisma/adapter-pg และ pg แล้ว
□ 6. seed.js ใช้ PrismaPg adapter ในการสร้าง PrismaClient
□ 7. รัน npx prisma db push หรือ migrate ก่อน seed
□ 8. รัน node prisma/seed.js เพื่อ seed
10. สรุปภาพรวม Flow
.env (DATABASE_URL)
↓
prisma.config.ts (datasource.url)
↓ npx prisma db push/migrate
schema.prisma (Models) → Database Tables
↓ node prisma/seed.js
seed.js (PrismaPg adapter + PrismaClient) → Insert data → DB