Prisma Json Type
🧩 ১️⃣ JSON টাইপ কীভাবে কাজ করে Prisma-তে
Prisma schema-তে তুমি যখন Json টাইপ ব্যবহার করো, যেমন:
model Event {
id Int @id @default(autoincrement())
name String
metaData Json
}
তাহলে Prisma বুঝে নেয় যে metaData ফিল্ডে তুমি যেকোনো valid JSON data (object, array, string, number, boolean, null) সংরক্ষণ করতে পারবে।
উদাহরণঃ
await prisma.event.create({
data: {
name: "Web Dev Fest",
metaData: {
location: "CSE Building",
speakers: ["Ali", "Rahim"],
capacity: 150
}
}
});
🧠 ২️⃣ কিন্তু TypeScript এ টাইপ নিয়ে সমস্যা কেন হয়?
TypeScript খুব strict —
সে চায় যেন তুমি Prisma-র JSON ফিল্ডে যে ডেটা পাঠাও, সেটি নিশ্চিতভাবে valid JSON value হয়।
এখানেই আসে 👉 Prisma.JsonValue, Prisma.InputJsonValue, Prisma.JsonObject ইত্যাদি টাইপ।
⚙️ ৩️⃣ এদের মানে কী?
| টাইপ | ব্যবহার | কাজ |
|---|---|---|
Prisma.JsonValue |
General JSON data পড়ার সময় | যখন তুমি Prisma থেকে data পড়ো (output) |
Prisma.InputJsonValue |
JSON data লেখার সময় | যখন তুমি Prisma তে data পাঠাও (input) |
Prisma.JsonObject |
নির্দিষ্টভাবে object টাইপ | যখন নিশ্চিত যে data একটা object, array নয় |
🧩 ৪️⃣ কখন এগুলো ব্যবহার করতে হয়?
ধরো তুমি TypeScript এ একটা ফাংশন লিখছো যা Prisma দিয়ে JSON ফিল্ডে data ইনসার্ট করবে —
import { Prisma } from "@prisma/client";
async function addEvent(meta: Prisma.InputJsonValue) {
await prisma.event.create({
data: {
name: "AI Summit",
metaData: meta
}
});
}
এখানে meta প্যারামিটারের টাইপ হিসেবে Prisma.InputJsonValue ব্যবহার করায় TypeScript নিশ্চিত হবে যে তুমি যেটা পাঠাচ্ছো সেটা valid JSON (যেমন object, array, ইত্যাদি)।
যদি তুমি শুধু any ব্যবহার করো, তাহলে TypeScript warning বা Prisma error দিতে পারে, কারণ সেটা JSON structure guarantee করে না।
🚫 ৫️⃣ যদি না দাও তাহলে কী হয়?
যদি তুমি টাইপ না দাও (অর্থাৎ যেভাবে খুশি JSON পাঠাও),
TypeScript compile-time এ error দিবে যেমনঃ
Type '{ foo: string; bar: number; }' is not assignable to type 'Prisma.InputJsonValue'.
অথবা runtime এ Prisma JSON serialization error দিতে পারে।
✅ ৬️⃣ সংক্ষেপে নিয়মটা এমন:
| কাজ | ব্যবহার |
|---|---|
| Prisma-তে JSON ফিল্ডে ডাটা লেখা (insert/update) | Prisma.InputJsonValue |
| Prisma-র JSON ফিল্ড থেকে ডাটা পড়া | Prisma.JsonValue |
| নিশ্চিতভাবে object টাইপ | Prisma.JsonObject |
🎯 উদাহরণ:
import { Prisma } from "@prisma/client";
// ✅ JSON ইনপুট
const meta: Prisma.InputJsonValue = {
category: "Tech",
tags: ["AI", "ML"],
date: new Date().toISOString()
};
await prisma.event.create({
data: {
name: "AI Conference",
metaData: meta
}
});
// ✅ JSON রিড
const event = await prisma.event.findFirst();
const data: Prisma.JsonValue = event?.metaData;
Example :
কীভাবে Prisma + TypeScript দিয়ে Json ফিল্ডে nested structured data নিরাপদভাবে handle করা যায়,
এবং কীভাবে Prisma.JsonValue / Prisma.InputJsonValue টাইপ সঠিকভাবে ব্যবহার করতে হয়।
🧩 ১️⃣ ধরো তোমার Prisma Schema এমন:
model Event {
id Int @id @default(autoincrement())
name String
metaData Json // এখানে আমরা JSON টাইপ ব্যবহার করছি
createdAt DateTime @default(now())
}
এই metaData ফিল্ডে আমরা nested data (object, array, ইত্যাদি) রাখতে পারবো।
⚙️ ২️⃣ Prisma Type Import করা:
তোমার TypeScript ফাইলে নিচেরটা import করতে হবে 👇
import { Prisma, PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
🧠 ৩️⃣ Prisma.InputJsonValue দিয়ে ইনসার্ট করা (create)
এখন আমরা একটা ইভেন্ট তৈরি করবো যেটার মধ্যে nested JSON থাকবে:
(এখানে metaData-এর টাইপ হিসেবে আমরা Prisma.InputJsonValue ব্যবহার করবো)
async function createEvent() {
const metaData: Prisma.InputJsonValue = {
category: "Technology",
tags: ["AI", "Machine Learning", "Cloud"],
schedule: {
date: "2025-12-01",
time: "10:00 AM",
speakers: [
{ name: "Dr. Rahim", topic: "AI Trends" },
{ name: "Ali Khan", topic: "Serverless Systems" }
]
},
location: {
building: "CSE Block",
room: 203
}
};
await prisma.event.create({
data: {
name: "Tech Conference 2025",
metaData: metaData
}
});
console.log("✅ Event created successfully!");
}
👉 এখানে metaData object-এর মধ্যে array ও nested object আছে —
এগুলো সবই Prisma.InputJsonValue হিসেবে valid, তাই Prisma ও TypeScript কোন error দিবে না।
🔍 ৪️⃣ Prisma.JsonValue দিয়ে পড়া (find)
যখন তুমি Prisma দিয়ে ডাটা রিড করবে, তখন সেই JSON ডাটা টাইপ হবে Prisma.JsonValue।
async function readEvent() {
const event = await prisma.event.findFirst();
const metaData: Prisma.JsonValue = event?.metaData;
console.log("📦 MetaData:", metaData);
}
এখানে metaData JSON ডাটা যেটা তুমি আগে ইনসার্ট করেছিলে — সেটা safe টাইপে পাবে।
🧮 ৫️⃣ Nested JSON Access করতে চাও?
তুমি টাইপ narrowing করে করতে পারো 👇
if (event && typeof event.metaData === "object" && event.metaData !== null) {
const meta = event.metaData as Prisma.JsonObject;
const schedule = meta["schedule"] as Prisma.JsonObject;
console.log("🕒 Event Date:", schedule["date"]);
}
এভাবে TypeScript কে জানানো হয় যে metaData একটা object, তাই safe ভাবে access করা যায়।
🚨 ৬️⃣ যদি any ব্যবহার করো তাহলে কী হবে?
যদি তুমি metaData: any দাও, তাহলে TypeScript তোমাকে কোন error দেখাবে না,
কিন্তু পরে ভুল data (যেমন function, undefined, circular ref) দিলে Prisma JSON serialize করতে গিয়ে crash করবে।
তাই সবসময়ই 👉
✅ Prisma.InputJsonValue (for input)
✅ Prisma.JsonValue (for output)
এই টাইপগুলো ব্যবহার করাই best practice।
✅ সারসংক্ষেপ:
| কাজ | ব্যবহার করার টাইপ | উদাহরণ |
|---|---|---|
| Create / Update JSON data | Prisma.InputJsonValue |
Insert করার সময় |
| Read JSON data | Prisma.JsonValue |
Read করার সময় |
| Specific object structure | Prisma.JsonObject |
Nested field access করার সময় |