Connect database Postgresql with Prisma in Next.js 13. Chúng ta xây dựng database cùng với Prisma.
Trong Prisma ta cần cấu hình các Model đúng với cấu trúc dữ liệu. Sau đó chúng ta dùng lệnh migration trong Prisma để tạo cở sở dữ liệu đến Postgresql.
Nếu mọi thứ thành công, chúng ta có thể sử dụng Prisma trong Next.js, để thao tác các câu lệnh truy vấn đển Postgresql, chẳng hạn như :create, edit, update, delete,...
# .env
DATABASE_URL="postgresql://hoadev:hoadev123@localhost:5432/hoadev_db?schema=public"
# shema.primsa
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
products Product[]
user_role User_Role[]
user_group User_Group[]
}
model Role {
id Int @id @default(autoincrement())
name String
user_role User_Role[]
role_permission Role_Permission[]
}
model User_Role {
userId Int
roleId Int
user User @relation(fields: [userId], references: [id])
role Role @relation(fields: [roleId], references: [id])
@@id([userId, roleId])
}
model Permission {
id Int @id @default(autoincrement())
name String
role_permission Role_Permission[]
}
model Role_Permission {
roleId Int
PermissionId Int
role Role @relation(fields: [roleId], references: [id])
Permission Permission @relation(fields: [PermissionId], references: [id])
@@id([roleId, PermissionId])
}
model Group{
id Int @id @default(autoincrement())
name String
user_group User_Group[]
}
model User_Group{
userId Int
groupId Int
user User @relation(fields: [userId],references: [id])
group Group @relation(fields: [groupId], references: [id])
@@id([userId,groupId])
}
model Product {
id Int @id @default(autoincrement())
title String
description String
slug String
price Float
discountPercentage Float
rating Float
stock Int
brand String
category String
thumbnail String
images Json?
author User @relation(fields: [authorId], references: [id])
authorId Int
product_categories_category Product_Category[]
}
model Category {
id Int @id @default(autoincrement())
name String
slug String
parent Int
position Int
product_categories_category Product_Category[]
}
model Product_Category {
id Int @id @default(autoincrement())
productId Int?
categoryId Int?
category Category? @relation(fields: [categoryId], references: [id])
product Product? @relation(fields: [productId], references: [id])
}
# _lib/prisma/index.ts :
Tạo file này trong Next.js của bạn để sử dụng prisma
import { PrismaClient } from '@prisma/client';
let prisma: PrismaClient;
declare const global: {
prisma?: PrismaClient;
};
if (process.env.NODE_ENV === 'production') {
prisma = new PrismaClient();
} else {
if (!global.prisma) {
global.prisma = new PrismaClient();
}
prisma = global.prisma;
}
export default prisma;