TypeORM এবং GraphQL Integration

টাইপওআরএম (TypeORM) - Web Development

316

TypeORM এবং GraphQL এর পরিচিতি

TypeORM হলো একটি Object-Relational Mapping (ORM) লাইব্রেরি যা JavaScript/TypeScript-এ ডেটাবেস ম্যানিপুলেশন সহজ করে তোলে। এটি SQL ডেটাবেসের সাথে কাজ করার জন্য ডেটাবেসের টেবিলকে অবজেক্টের সাথে ম্যাপ করে এবং SQL কোড লেখার প্রয়োজন ছাড়াই ডেটাবেসের সাথে যোগাযোগ করতে সাহায্য করে।

GraphQL হল একটি কুয়েরি ভাষা (Query Language) এবং রানটাইম পরিবেশ যা API এর জন্য ব্যবহৃত হয়। এটি ক্লায়েন্টকে ডেটার কাঠামো সংজ্ঞায়িত করার স্বাধীনতা দেয় এবং নির্দিষ্ট ডেটা প্রয়োজন অনুযায়ী অনুরোধ করতে সক্ষম করে। REST API এর তুলনায়, GraphQL অধিক ফ্লেক্সিবল এবং দক্ষ API যোগাযোগের জন্য ব্যবহৃত হয়।

TypeORM এবং GraphQL একত্রে ব্যবহৃত হলে, আপনি একটি শক্তিশালী API তৈরি করতে পারেন যেখানে GraphQL কুয়েরি ব্যবহারের মাধ্যমে ডেটাবেস অপারেশন TypeORM এর মাধ্যমে পরিচালিত হয়। এখানে, আমরা TypeORM এবং GraphQL কে একত্রে ব্যবহার করার কিছু গুরুত্বপূর্ণ পদক্ষেপ এবং কৌশল নিয়ে আলোচনা করব।


TypeORM এবং GraphQL একত্রিত করার পদক্ষেপ

১. প্রকল্প তৈরি এবং প্রয়োজনীয় প্যাকেজ ইনস্টলেশন

প্রথমে, আপনাকে Node.js প্রোজেক্ট তৈরি করতে হবে এবং এর জন্য কিছু গুরুত্বপূর্ণ প্যাকেজ ইনস্টল করতে হবে।

mkdir typeorm-graphql
cd typeorm-graphql
npm init -y
npm install typeorm graphql apollo-server-express express reflect-metadata pg

এখানে:

  • typeorm: TypeORM লাইব্রেরি ইনস্টল করছে।
  • graphql: GraphQL এর জন্য মূল প্যাকেজ।
  • apollo-server-express: Express এর সাথে Apollo Server ব্যবহার করতে।
  • express: HTTP সার্ভার তৈরি করার জন্য।
  • reflect-metadata: TypeORM এ মেটাডেটা ব্যবহারের জন্য।
  • pg: PostgreSQL ডেটাবেস ড্রাইভার (আপনার ব্যবহৃত ডেটাবেস অনুযায়ী এটি পরিবর্তন হবে, যেমন MySQL এর জন্য mysql2 ড্রাইভার ব্যবহার করতে হবে)।

২. TypeORM Entity তৈরি

TypeORM এ ডেটাবেস টেবিলের জন্য Entity তৈরি করতে হয়, যা ডেটাবেসের টেবিলের প্রতিনিধিত্ব করে। এখানে একটি User Entity তৈরি করা হচ্ছে।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

এখানে, User Entity তৈরি করা হয়েছে, যার মধ্যে id, name, এবং email কলাম রয়েছে। এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।

৩. Apollo Server এবং GraphQL Schema সেটআপ

এখন Apollo Server এর মাধ্যমে GraphQL সেটআপ করতে হবে। Apollo Server Express ব্যবহার করলে GraphQL কুয়েরি এবং মিউটেশনগুলিকে সহজে পরিচালনা করা যায়।

import "reflect-metadata";
import { ApolloServer } from "apollo-server-express";
import { makeExecutableSchema } from "@graphql-tools/schema";
import express from "express";
import { createConnection } from "typeorm";
import { User } from "./entity/User";

const app = express();

// TypeORM ডাটাবেস সংযোগ স্থাপন
createConnection({
  type: "postgres",  // বা আপনার ব্যবহৃত ডেটাবেসের প্রকার (MySQL, SQLite ইত্যাদি)
  host: "localhost",
  port: 5432,
  username: "test",  // আপনার ডেটাবেসের ইউজারনেম
  password: "password",  // আপনার ডেটাবেসের পাসওয়ার্ড
  database: "test",  // ডেটাবেসের নাম
  entities: [User],
  synchronize: true,
}).then(() => {
  console.log("Connected to the database!");
});

// GraphQL স্কিমা তৈরি
const typeDefs = `
  type User {
    id: ID!
    name: String!
    email: String!
  }

  type Query {
    users: [User]
    user(id: ID!): User
  }

  type Mutation {
    createUser(name: String!, email: String!): User
  }
`;

const resolvers = {
  Query: {
    users: async () => {
      const users = await User.find();
      return users;
    },
    user: async (_: any, args: { id: number }) => {
      const user = await User.findOne(args.id);
      return user;
    },
  },
  Mutation: {
    createUser: async (_: any, args: { name: string; email: string }) => {
      const newUser = new User();
      newUser.name = args.name;
      newUser.email = args.email;
      await newUser.save();
      return newUser;
    },
  },
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

const server = new ApolloServer({ schema });

server.applyMiddleware({ app });

// Express অ্যাপ্লিকেশন চালু করা
app.listen({ port: 4000 }, () =>
  console.log("Server is running at http://localhost:4000/graphql")
);

এখানে:

  1. TypeORM ডেটাবেস সংযোগ তৈরি করা হয়েছে, যেখানে User Entity কে ডেটাবেসের সাথে সংযুক্ত করা হয়েছে।
  2. ApolloServer ব্যবহার করে GraphQL সার্ভার তৈরি করা হয়েছে, যেখানে Query এবং Mutation এর জন্য রেজলভার ফাংশন দেওয়া হয়েছে।
  3. createUser মিউটেশন ব্যবহার করে নতুন ব্যবহারকারী তৈরি করা হয়, এবং users কুয়েরি দিয়ে সমস্ত ব্যবহারকারীর ডেটা পাওয়া যায়।

৪. GraphQL কুয়েরি এবং মিউটেশন

এখন আপনি GraphQL এর মাধ্যমে Query এবং Mutation ব্যবহার করতে পারবেন। উদাহরণস্বরূপ:

Users কুয়েরি:

query {
  users {
    id
    name
    email
  }
}

Create User মিউটেশন:

mutation {
  createUser(name: "Jane Doe", email: "jane.doe@example.com") {
    id
    name
    email
  }
}

৫. TypeORM এবং GraphQL এর মধ্যে ডেটা অ্যান্ডিং

এখানে, আপনি User Entity ডেটাকে GraphQL কুয়েরি ও মিউটেশন মাধ্যমে রিটার্ন এবং তৈরি করতে পারবেন। TypeORM এর find() এবং save() মেথড ব্যবহার করে ডেটা পরিচালনা করা হয়, এবং GraphQL কুয়েরি ও মিউটেশন ডেটাকে এক্সপোজ করে ক্লায়েন্টকে।


সারাংশ

TypeORM এবং GraphQL Integration হল একটি শক্তিশালী কৌশল যা আপনাকে ডেটাবেস অপারেশন সহজে পরিচালনা করতে সাহায্য করে। TypeORM ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয় এবং GraphQL API-কে ফ্লেক্সিবল এবং কার্যকরী করে তোলে। TypeORM ডেটাবেস ম্যানেজমেন্ট এবং Apollo Server GraphQL API এর জন্য ব্যবহৃত হয়ে একটি সম্পূর্ণ ওয়েব অ্যাপ্লিকেশন তৈরি করা যায় যেখানে ক্লায়েন্টদের জন্য বিভিন্ন কুয়েরি এবং মিউটেশন পাওয়া যায়।

Content added By

GraphQL: একটি পরিচিতি

GraphQL একটি API কুয়েরি ভাষা (Query Language) এবং এটি ডেটা ফেচিং এর জন্য একটি রানটাইম পরিবেশ। এটি মূলত Facebook এর দ্বারা তৈরি করা হয় এবং ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি নতুন এবং অত্যন্ত শক্তিশালী কৌশল হিসেবে আবির্ভূত হয়েছে।

প্রথাগত REST API এর তুলনায়, GraphQL ডেটা ফেচিংয়ে অনেক বেশি নমনীয়তা, দক্ষতা এবং নিয়ন্ত্রণ প্রদান করে। এতে ক্লায়েন্ট সাইড থেকে প্রয়োজনীয় ডেটার উপর সম্পূর্ণ নিয়ন্ত্রণ থাকে, যা REST API এর তুলনায় অনেক বেশি কাস্টমাইজড এবং কার্যকরী হয়।


GraphQL এর বৈশিষ্ট্যসমূহ

  1. কাস্টম কুয়েরি: ক্লায়েন্ট তার প্রয়োজনীয় ডেটা নির্দিষ্টভাবে চিহ্নিত করে, শুধুমাত্র প্রয়োজনীয় ডেটা রিটার্ন করা হয়, যার ফলে অপ্রয়োজনীয় ডেটা লোড করার ঝামেলা কমে যায়।
  2. একটি EndPoint: GraphQL এ সমস্ত কুয়েরি এবং মিউটেশন একটি একক এন্ডপয়েন্টের মাধ্যমে পরিচালিত হয়। অর্থাৎ, আপনি একাধিক URL এন্ডপয়েন্টের পরিবর্তে একটি একক এন্ডপয়েন্টে সমস্ত ডেটা রিকোয়েস্ট পাঠাতে পারেন।
  3. ইন্টারনাল ডেটার উপর নিয়ন্ত্রণ: ক্লায়েন্ট তার প্রয়োজনীয় ডেটার কাঠামো এবং গঠন নির্ধারণ করতে পারে। এটি ডেভেলপারদের এবং ডেটা কনসামারদের আরও কাস্টমাইজড এবং সহজ ডেটা এক্সেস প্রদান করে।
  4. স্ট্রং টাইপিং: GraphQL স্কিমা টাইপ-ভিত্তিক, যার মাধ্যমে আপনি পরিষ্কারভাবে ডেটার গঠন এবং কুয়েরি পারমিশন নির্ধারণ করতে পারেন।
  5. ডেটা অ্যাগ্রিগেশন: একাধিক রিসোর্স থেকে ডেটা একত্রিত করা যায় এবং একটি কুয়েরির মাধ্যমে সমস্ত ডেটা পাওয়া যায়, যা REST API এ সম্ভব নয় বা খুবই জটিল হতে পারে।

GraphQL কেন প্রয়োজন?

1. ফ্লেক্সিবল ডেটা রিকোয়েস্ট:

REST API তে আপনাকে নির্দিষ্ট URL এর মাধ্যমে নির্দিষ্ট ডেটা রিকোয়েস্ট করতে হয়, এবং কখনও কখনও অপ্রয়োজনীয় ডেটা লোড হতে পারে। অন্যদিকে, GraphQL এ আপনি শুধুমাত্র আপনার প্রয়োজনীয় ডেটা নির্বাচন করতে পারেন, ফলে ডেটা রিকোয়েস্ট অনেক ফ্লেক্সিবল এবং কার্যকরী হয়।

উদাহরণ:

ধরা যাক, আপনি একটি REST API দিয়ে একটি User এর ডেটা ফেচ করতে চাইছেন। কিন্তু আপনাকে সেই রেসপন্সে User এর সমস্ত ডেটা প্রয়োজন হতে পারে না—বিশেষভাবে কিছু ডেটা বা সম্পর্কিত ডেটা বাদ দিয়ে। GraphQL দিয়ে আপনি শুধুমাত্র যেসব ডেটা চান তা নির্দিষ্টভাবে রিকোয়েস্ট করতে পারেন।

query {
  user(id: 1) {
    name
    email
  }
}

এখানে, আপনি শুধুমাত্র name এবং email চাচ্ছেন, id বা অন্য কোন অপ্রয়োজনীয় ডেটার প্রয়োজন নেই। এটি ডেটা লোডিংয়ের কার্যকারিতা বাড়ায়।


2. একটি EndPoint মাধ্যমে সমস্ত রিকোয়েস্ট:

REST API তে বিভিন্ন রিসোর্সের জন্য আলাদা আলাদা এন্ডপয়েন্ট থাকতে পারে, যেমন /users, /posts, /comments ইত্যাদি। কিন্তু GraphQL এ সমস্ত রিকোয়েস্ট একটি একক এন্ডপয়েন্টের মাধ্যমে পরিচালিত হয়, যা ডেভেলপমেন্টের সময় সিম্পলিফাই করে এবং রক্ষণাবেক্ষণ সহজ করে।

POST /graphql
{
  query: {
    getUser(id: 1) {
      name
    }
  }
}

এখানে, /graphql এন্ডপয়েন্টে আপনি সমস্ত ডেটা ফেচ করতে পারেন এবং এতে সব রিকোয়েস্ট এক জায়গায় প্রোসেস হয়।


3. ডেটার শেপিং এবং কাস্টমাইজেশন:

REST API তে আপনি নির্দিষ্ট ফরম্যাটে ডেটা পাবেন যা কখনো কখনো আপনার প্রয়োজনীয়তা পূর্ণ করতে পারে না। GraphQL এ আপনি Query এর মাধ্যমে নির্দিষ্ট ডেটার কাঠামো এবং আউটপুট কাস্টমাইজ করতে পারেন। এটি ডেভেলপারদের জন্য আরও স্বাধীনতা এবং কন্ট্রোল প্রদান করে।


4. বাফারিং এবং অ্যাগ্রিগেশন:

GraphQL একাধিক ডেটা সোর্স বা API এর মধ্যে অ্যাগ্রিগেটেড ডেটা লোড করতে সক্ষম। এটি একাধিক API থেকে একযোগে ডেটা আনতে সাহায্য করে, যেখানে REST API তে আপনাকে প্রতিটি রিসোর্সের জন্য আলাদা আলাদা রিকোয়েস্ট পাঠাতে হয়।

query {
  user(id: 1) {
    name
    posts {
      title
    }
  }
}

এখানে, আপনি একটিমাত্র কুয়েরির মাধ্যমে User এবং তার সম্পর্কিত Posts ডেটা দুটি একসাথে রিটার্ন করতে পারেন। REST API তে আলাদা আলাদা রিকোয়েস্ট করতে হত।


GraphQL এবং TypeORM এর মধ্যে সম্পর্ক

TypeORM এবং GraphQL একসাথে ব্যবহৃত হলে, আপনি ডেটাবেসের সাথে GraphQL API তৈরির জন্য খুবই কার্যকরী একটি সিস্টেম পেতে পারেন। TypeORM দিয়ে আপনি ডেটাবেস মডেল তৈরি করতে পারেন এবং GraphQL দিয়ে সেই মডেলের জন্য কাস্টম কুয়েরি তৈরি করতে পারেন। এতে ডেটাবেস এবং API এর মধ্যে কার্যকরী যোগাযোগ স্থাপন হয়।

TypeORM এবং GraphQL ব্যবহারের কিছু সুবিধা:

  • কাস্টম স্কিমা: TypeORM এর মাধ্যমে আপনি ডেটাবেসের স্কিমা তৈরি করতে পারবেন এবং GraphQL এর মাধ্যমে সেই স্কিমার জন্য কুয়েরি তৈরি করবেন।
  • ডেটা লোডিং অপটিমাইজেশন: GraphQL এর মাধ্যমে নির্দিষ্ট ডেটা নির্বাচন করা সহজ হয়ে যায়, এবং TypeORM এর সাথে এটি কার্যকরী ডেটাবেস অপটিমাইজেশন প্রদান করে।
  • ফ্লেক্সিবল API: TypeORM এবং GraphQL একসাথে একটি খুবই ফ্লেক্সিবল এবং পাওয়ারফুল API তৈরি করতে সক্ষম, যা ওয়েব ডেভেলপমেন্টে ব্যবহারকারীর চাহিদা পূরণ করতে সক্ষম।

সারাংশ

GraphQL হল একটি শক্তিশালী এবং অত্যন্ত নমনীয় API কুয়েরি ভাষা যা ক্লায়েন্ট-সাইডের নিয়ন্ত্রণে থাকা ডেটা ফেচিং এবং ডেটা ম্যানিপুলেশন ব্যবস্থাপনার জন্য ব্যবহার হয়। REST API এর তুলনায় GraphQL আরও কার্যকরী, ফ্লেক্সিবল এবং কাস্টমাইজড ডেটা রিকোয়েস্ট প্রদান করে। TypeORM এর সাথে GraphQL ব্যবহার করলে, আপনি ডেটাবেসের সাথে শক্তিশালী, কার্যকরী এবং সাশ্রয়ী ডেটা যোগাযোগ তৈরি করতে পারেন, যা ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টে অনেক সুবিধা প্রদান করে।

Content added By

GraphQL এবং TypeORM এর পরিচিতি

GraphQL একটি জিজ্ঞাসা ভাষা (query language) এবং API এর জন্য একটি রানটাইম, যা ক্লায়েন্টদেরকে তাদের প্রয়োজনীয় ডেটা সুনির্দিষ্টভাবে অনুরোধ করতে সক্ষম করে। এটি REST API এর বিকল্প হিসাবে ব্যবহৃত হয়, কারণ GraphQL এ ক্লায়েন্ট শুধুমাত্র প্রয়োজনীয় ডেটা পাঠায় এবং সার্ভার শুধুমাত্র সেই ডেটা রিটার্ন করে, ফলে কার্যকরী এবং কম্প্যাক্ট ডেটা ট্রান্সফার হয়।

TypeORM একটি জনপ্রিয় ORM (Object-Relational Mapping) লাইব্রেরি যা TypeScript এবং JavaScript এর জন্য ডেটাবেস পরিচালনা সহজ করে তোলে। TypeORM ব্যবহার করলে ডেটাবেসের টেবিলগুলোকে অবজেক্ট হিসেবে ম্যাপ করা যায় এবং জটিল SQL কুয়েরি লেখার প্রয়োজন হয় না।

GraphQL এবং TypeORM এর সংমিশ্রণ Web Development-এ শক্তিশালী ডেটা ম্যানিপুলেশন এবং API প্রদান করতে পারে। এই গাইডে, আমরা দেখব TypeORM এর সাথে GraphQL কিভাবে ইন্টিগ্রেট করা যায়।


TypeORM এবং GraphQL ইন্টিগ্রেশন: একটি সাধারণ প্রক্রিয়া

১. প্রকল্প সেটআপ

প্রথমে, আমাদের Node.js এবং TypeScript ভিত্তিক একটি প্রকল্প তৈরি করতে হবে। এরপর, আমরা TypeORM, GraphQL, এবং অন্যান্য প্রয়োজনীয় লাইব্রেরি ইনস্টল করব।

১.১ Node.js প্রকল্প তৈরি করা:
mkdir typeorm-graphql-project
cd typeorm-graphql-project
npm init -y
১.২ প্রয়োজনীয় প্যাকেজ ইনস্টল করা:
npm install typeorm graphql @nestjs/graphql typeorm-graphql apollo-server-express express reflect-metadata
npm install typescript ts-node @types/node --save-dev
  • typeorm: TypeORM লাইব্রেরি ইনস্টল।
  • graphql: GraphQL লাইব্রেরি।
  • @nestjs/graphql: NestJS এর জন্য GraphQL।
  • apollo-server-express: Apollo Server যা Express এ GraphQL চালাতে সাহায্য করে।
১.৩ TypeScript কনফিগারেশন:
npx tsc --init

এটি tsconfig.json ফাইল তৈরি করবে যেখানে TypeScript কম্পাইলেশন সেটিংস কনফিগার করা হয়।


২. TypeORM কনফিগারেশন

TypeORM সেটআপের জন্য একটি ডাটাবেস কনফিগারেশন ফাইল তৈরি করতে হবে।

২.১ ormconfig.json ফাইল তৈরি করা:
{
  "type": "postgres",
  "host": "localhost",
  "port": 5432,
  "username": "postgres",
  "password": "your_password",
  "database": "your_database",
  "entities": ["src/entity/*.ts"],
  "synchronize": true
}

এখানে, আমরা PostgreSQL ডাটাবেস ব্যবহার করেছি, তবে আপনি অন্য ডেটাবেস ড্রাইভার যেমন MySQL, SQLite ইত্যাদি ব্যবহার করতে পারেন।


৩. Entity তৈরি করা

এখন একটি Entity তৈরি করা যাক, যাতে আমাদের ডাটাবেসের টেবিলের গঠন থাকে। এখানে, আমরা User নামক একটি Entity তৈরি করছি।

৩.১ User Entity তৈরি করা:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

এখানে, User Entity একটি টেবিলের প্রতিনিধিত্ব করছে যেটিতে id, name, এবং email কলাম রয়েছে।


৪. GraphQL স্কিমা তৈরি করা

GraphQL স্কিমা তৈরি করার জন্য আমরা @nestjs/graphql লাইব্রেরির @ObjectType, @Field ডেকোরেটর ব্যবহার করব।

৪.১ User স্কিমা তৈরি করা:
import { ObjectType, Field, Int } from '@nestjs/graphql';

@ObjectType()
export class UserType {
  @Field(type => Int)
  id: number;

  @Field()
  name: string;

  @Field()
  email: string;
}

এখানে, আমরা UserType নামে একটি GraphQL স্কিমা তৈরি করেছি, যেটি User Entity এর মত দেখতে।


৫. Resolver তৈরি করা

Resolver হল GraphQL এ রিকোয়েস্ট হ্যান্ডল করার জায়গা, যেখানে কুয়েরি এবং মিউটেশনগুলি ব্যাখ্যা করা হয়।

৫.১ User Resolver তৈরি করা:
import { Resolver, Query, Mutation, Args } from '@nestjs/graphql';
import { UserType } from './user.model';
import { User } from './user.entity';
import { getRepository } from 'typeorm';

@Resolver(of => UserType)
export class UserResolver {
  @Query(returns => [UserType])
  async users(): Promise<User[]> {
    return await getRepository(User).find();
  }

  @Mutation(returns => UserType)
  async createUser(
    @Args('name') name: string,
    @Args('email') email: string,
  ): Promise<User> {
    const user = new User();
    user.name = name;
    user.email = email;
    return await getRepository(User).save(user);
  }
}

এখানে, users কুয়েরি ব্যবহার করে সব User রিটার্ন করা হয়েছে এবং createUser মিউটেশন ব্যবহার করে নতুন ব্যবহারকারী তৈরি করা হয়েছে।


৬. GraphQL Server তৈরি করা

এখন আমাদের Apollo Server ব্যবহার করে GraphQL API চালু করতে হবে।

৬.১ Apollo Server ইনস্টলেশন এবং কনফিগারেশন:
import { ApolloServer } from 'apollo-server-express';
import express from 'express';
import { buildSchema } from 'type-graphql';
import { UserResolver } from './user.resolver';
import { createConnection } from 'typeorm';

async function startServer() {
  const app = express();
  
  // TypeORM connection
  await createConnection();

  // GraphQL schema
  const schema = await buildSchema({
    resolvers: [UserResolver],
  });

  // Apollo Server setup
  const server = new ApolloServer({
    schema,
  });

  // Apply middleware to Express app
  server.applyMiddleware({ app });

  app.listen(4000, () =>
    console.log('Server is running at http://localhost:4000/graphql')
  );
}

startServer();

এখানে, আমরা ApolloServer দিয়ে GraphQL API তৈরি করছি এবং UserResolver-এ ডিফাইন করা কুয়েরি এবং মিউটেশনগুলি চালু করছি।


৭. GraphQL API টেস্ট করা

আপনার অ্যাপ্লিকেশন চালু করার পর, আপনি http://localhost:4000/graphql URL এ গিয়ে GraphQL API টেস্ট করতে পারবেন। নিচে কিছু কুয়েরি এবং মিউটেশন উদাহরণ দেওয়া হলো:

Query (সব User দেখা):
query {
  users {
    id
    name
    email
  }
}
Mutation (নতুন User তৈরি করা):
mutation {
  createUser(name: "John Doe", email: "john@example.com") {
    id
    name
    email
  }
}

সারাংশ

TypeORM এর সাথে GraphQL ইন্টিগ্রেশন Web Development-এ শক্তিশালী এবং কার্যকরী API তৈরি করতে সাহায্য করে। আপনি TypeORM ব্যবহার করে ডেটাবেসের সাথে সম্পর্কিত ডেটা পরিচালনা করতে পারেন এবং GraphQL ব্যবহার করে ক্লায়েন্টদের জন্য প্রয়োজনীয় ডেটা নির্দিষ্টভাবে এবং কার্যকরীভাবে প্রদান করতে পারেন। এই গাইডে TypeORM এবং GraphQL এর সাথে ইন্টিগ্রেশন এবং সেটআপ করার প্রক্রিয়া বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে, যাতে আপনি একটি পূর্ণাঙ্গ GraphQL API তৈরি করতে পারেন।

Content added By

GraphQL এবং TypeORM পরিচিতি

GraphQL হল একটি শক্তিশালী API ভাষা এবং রানটাইম, যা ক্লায়েন্টদের নির্দিষ্টভাবে কীভাবে ডেটা চাওয়া হবে তা কাস্টমাইজ করার সুবিধা দেয়। এটি ডেটার জন্য একটি কুয়েরি ভাষা এবং একটি রানটাইম প্রদান করে যা ডেটা ফেচ, মিউটেশন এবং সাবস্ক্রিপশন পরিচালনা করতে সহায়তা করে।

TypeORM হল একটি ORM (Object-Relational Mapping) লাইব্রেরি যা JavaScript/TypeScript-এ ডেটাবেস পরিচালনার জন্য ব্যবহৃত হয়। TypeORM ব্যবহার করে ডেটাবেস টেবিলের সাথে যোগাযোগ এবং CRUD অপারেশন খুব সহজে করা যায়।

এই টিউটোরিয়ালে, আমরা GraphQL এবং TypeORM একত্রে ব্যবহার করে কিভাবে ডেটা ফেচ করা যায়, সেই সম্পর্কে আলোচনা করব। এতে আমরা TypeORM এর Entity এবং GraphQL Resolver ব্যবহার করব ডেটা ফেচ এবং ম্যানিপুলেট করতে।


GraphQL Resolver এবং TypeORM এর মধ্যে সংযোগ

GraphQL Resolver হচ্ছে GraphQL কুয়েরির জন্য একটি ফাংশন যা কার্যকরী ডেটা প্রদান করে। TypeORM ব্যবহার করে আপনি GraphQL Resolver-এ ডেটাবেস থেকে ডেটা ফেচ করতে পারেন।


১. প্রথমে প্রয়োজনীয় প্যাকেজ ইনস্টল করা

GraphQL এবং TypeORM একসাথে কাজ করার জন্য প্রথমে আপনাকে কিছু প্যাকেজ ইনস্টল করতে হবে:

npm install typeorm graphql apollo-server-express reflect-metadata

এছাড়া, TypeScript ব্যবহার করলে TypeScript রিলেটেড প্যাকেজ ইনস্টল করুন:

npm install typescript ts-node @types/node @types/express

২. TypeORM Entity তৈরি করা

প্রথমে, একটি Entity তৈরি করতে হবে যা আপনার ডেটাবেস টেবিলের প্রতিনিধিত্ব করবে।

User Entity উদাহরণ:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

এখানে, User নামে একটি Entity তৈরি করা হয়েছে, যা ডেটাবেসের একটি টেবিলের প্রতিনিধিত্ব করে।


৩. GraphQL Schema তৈরি করা

এখন, আপনাকে GraphQL Schema তৈরি করতে হবে, যা কুয়েরি এবং মিউটেশন ডিফাইন করবে। এর মাধ্যমে আপনি ডেটা ফেচ এবং ম্যানিপুলেট করতে পারবেন।

GraphQL Schema উদাহরণ:

import { gql } from "apollo-server-express";

export const typeDefs = gql`
  type User {
    id: Int!
    name: String!
    email: String!
  }

  type Query {
    users: [User]
    user(id: Int!): User
  }

  type Mutation {
    createUser(name: String!, email: String!): User
  }
`;

এখানে আমরা User টাইপ তৈরি করেছি এবং একটি Query এবং Mutation সংজ্ঞায়িত করেছি। Query এর মধ্যে users এবং user এর জন্য কুয়েরি রয়েছে, যেখানে users সব ব্যবহারকারী রিটার্ন করবে এবং user(id) একটি নির্দিষ্ট আইডি অনুযায়ী ব্যবহারকারী রিটার্ন করবে। MutationcreateUser একটি নতুন ব্যবহারকারী তৈরি করবে।


৪. GraphQL Resolvers তৈরি করা

Resolvers হল সেই ফাংশন যা GraphQL Schema থেকে কুয়েরি বা মিউটেশন আসলে তাদের জন্য ডেটা ফেরত দেয়। এখন আমরা TypeORM এর রেপোজিটরি ব্যবহার করে ডেটাবেস থেকে ডেটা ফেচ এবং ম্যানিপুলেশন করব।

Resolvers উদাহরণ:

import { User } from "./entity/User";
import { getRepository } from "typeorm";

export const resolvers = {
  Query: {
    users: async () => {
      const userRepository = getRepository(User);
      return await userRepository.find();  // সকল ব্যবহারকারী ফেচ করা
    },
    user: async (_: any, { id }: { id: number }) => {
      const userRepository = getRepository(User);
      return await userRepository.findOne(id);  // নির্দিষ্ট ব্যবহারকারী ফেচ করা
    }
  },
  Mutation: {
    createUser: async (_: any, { name, email }: { name: string, email: string }) => {
      const userRepository = getRepository(User);
      const user = new User();
      user.name = name;
      user.email = email;

      return await userRepository.save(user);  // নতুন ব্যবহারকারী তৈরি করা
    }
  }
};

এখানে, আমরা Query এবং Mutation এর জন্য users, user, এবং createUser রেজলভার তৈরি করেছি। TypeORM এর getRepository(User) ব্যবহার করে আমরা ডেটাবেস থেকে ডেটা ফেচ করছি এবং নতুন ব্যবহারকারী তৈরি করছি।


৫. Apollo Server এবং Express সেটআপ

এখন, আমরা Apollo Server এবং Express ব্যবহার করে GraphQL API সেটআপ করব।

import "reflect-metadata";
import express from "express";
import { ApolloServer } from "apollo-server-express";
import { createConnection } from "typeorm";
import { typeDefs } from "./schema";
import { resolvers } from "./resolvers";

createConnection().then(async () => {
  const app = express();

  // Apollo Server তৈরি
  const server = new ApolloServer({
    typeDefs,
    resolvers
  });

  // Apollo Server কে Express এ যুক্ত করা
  await server.start();
  server.applyMiddleware({ app });

  app.listen(4000, () => {
    console.log("Server is running on http://localhost:4000/graphql");
  });
}).catch(error => console.log(error));

এখানে, আমরা Express এ একটি HTTP সার্ভার তৈরি করেছি এবং Apollo Server ব্যবহার করে GraphQL API তৈরি করেছি। এখন আপনি http://localhost:4000/graphql এ গিয়ে GraphQL কুয়েরি করতে পারবেন।


৬. GraphQL Query উদাহরণ

এখন, GraphQL API চালু করার পর, আপনি একটি GraphQL কুয়েরি ব্যবহার করে ডেটা ফেচ করতে পারেন। উদাহরণস্বরূপ:

Users কুয়েরি:

query {
  users {
    id
    name
    email
  }
}

Single User কুয়েরি:

query {
  user(id: 1) {
    id
    name
    email
  }
}

Create User Mutation:

mutation {
  createUser(name: "Jane Doe", email: "jane.doe@example.com") {
    id
    name
    email
  }
}

এখানে, আপনি users কুয়েরি ব্যবহার করে সমস্ত ব্যবহারকারী বা user(id: 1) কুয়েরি ব্যবহার করে একটি নির্দিষ্ট ব্যবহারকারী তথ্য পাবেন। এছাড়া, createUser মিউটেশন দিয়ে আপনি নতুন ব্যবহারকারী তৈরি করতে পারবেন।


সারাংশ

GraphQL এবং TypeORM একত্রে ব্যবহার করে আপনি একটি শক্তিশালী API তৈরি করতে পারেন, যেখানে ডেটাবেস থেকে ডেটা ফেচ এবং ম্যানিপুলেশন করতে TypeORM ব্যবহার হয় এবং GraphQL দিয়ে কাস্টম কুয়েরি বা মিউটেশন করা হয়। TypeORM এর getRepository এবং save এর মতো ফাংশনগুলো ব্যবহার করে আপনি সহজেই ডেটা ম্যানিপুলেশন করতে পারবেন, আর GraphQL Resolver দিয়ে সেই ডেটা ক্লায়েন্টের কাছে পৌঁছাতে পারবেন।

Content added By

TypeORM এবং Database Constraints

Database Constraints হল এমন শর্তাবলী যা ডেটাবেস টেবিলের ডেটা সঠিকতা এবং সামঞ্জস্য নিশ্চিত করতে ব্যবহৃত হয়। এটি ডেটাবেসে অকার্যকর বা অপ্রত্যাশিত ডেটা প্রবেশ করা থেকে রোধ করতে সহায়তা করে। TypeORM ব্যবহার করে আপনি ডেটাবেসে বিভিন্ন ধরনের কনস্ট্রেইন্ট যেমন Unique এবং Foreign Key কনস্ট্রেইন্ট ইজি ভাবে সেট করতে পারেন।

এই গাইডে, আমরা Unique এবং Foreign Key কনস্ট্রেইন্টগুলো TypeORM এ কীভাবে সেট করা যায় তা দেখব।


১. Unique Constraint

Unique Constraint হল একটি কনস্ট্রেইন্ট যা নিশ্চিত করে যে টেবিলের কোনো দুটি রেকর্ডে নির্দিষ্ট কলামের মান কখনও একই হবে না। এটি প্রাথমিকভাবে এমন ক্ষেত্রগুলির জন্য ব্যবহৃত হয় যেখানে প্রতিটি রেকর্ডের জন্য অনন্য (unique) মান থাকতে হবে, যেমন ইমেইল, ইউজার আইডি ইত্যাদি।

TypeORM-এ Unique Constraint তৈরি করতে @Column({ unique: true }) ব্যবহার করা হয়। এটি একটি কলামের উপরে নির্দিষ্ট করা হয় এবং টেবিলের সেগুলোর মান অনন্য হতে বাধ্য করে।

উদাহরণ: Unique Constraint ব্যবহার

ধরা যাক, আমরা একটি User টেবিল তৈরি করতে যাচ্ছি, যেখানে email ফিল্ডটি ইউনিক থাকবে:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  email: string;

  @Column()
  name: string;
}

এখানে, @Column({ unique: true }) দিয়ে email ফিল্ডে Unique Constraint যোগ করা হয়েছে, যার ফলে এই ফিল্ডে একাধিক রেকর্ডে একই ইমেইল থাকতে পারবে না।

মাইগ্রেশন তৈরি করা:

যেহেতু আপনি টেবিলের কাঠামো পরিবর্তন করেছেন, তাই একটি নতুন মাইগ্রেশন তৈরি করতে হবে:

typeorm migration:generate -n AddUniqueConstraintToEmail

এরপর মাইগ্রেশন রান করুন:

typeorm migration:run

এভাবে Unique Constraint আপনার ডেটাবেসে যোগ হবে।


২. Foreign Key Constraint

Foreign Key Constraint একটি টেবিলের কলামকে অন্য টেবিলের প্রাইমারি কিকে রেফারেন্স করে। এটি ডেটাবেসে সম্পর্কিত টেবিলগুলির মধ্যে ডেটার ইন্টিগ্রিটি নিশ্চিত করে। Foreign Key কনস্ট্রেইন্ট ব্যবহার করলে আপনি নিশ্চিত করতে পারেন যে এক টেবিলের কোনো রেকর্ড অপর টেবিলের সম্পর্কিত রেকর্ডে থাকা একটি বৈধ মানের সাথে সংযুক্ত রয়েছে।

TypeORM-এ Foreign Key কনস্ট্রেইন্ট তৈরি করতে @ManyToOne এবং @JoinColumn ডেকোরেটর ব্যবহার করা হয়।

উদাহরণ: Foreign Key Constraint ব্যবহার

ধরা যাক, আমরা একটি Post টেবিল তৈরি করছি, যেখানে প্রতিটি Post এর একটি User এর সাথে সম্পর্ক থাকবে (One-to-Many এবং Many-to-One সম্পর্ক)।

import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from "typeorm";
import { User } from "./User";

@Entity()
export class Post {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @ManyToOne(() => User, user => user.posts)
  @JoinColumn({ name: "userId" })
  user: User;
}

এখানে, Post টেবিলের userId কলামটি User টেবিলের id কলামের সাথে সম্পর্কিত। @JoinColumn ডেকোরেটরটি সম্পর্কিত কলামটি যোগ করতে ব্যবহৃত হয় এবং Foreign Key কনস্ট্রেইন্ট তৈরি হয়।

User Entity:

import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Post } from "./Post";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @OneToMany(() => Post, post => post.user)
  posts: Post[];
}

এখানে, OneToMany ডেকোরেটর ব্যবহার করে একটি User এর একাধিক Post থাকতে পারে, এবং প্রতিটি Post একটি User এর সাথে সম্পর্কিত।

মাইগ্রেশন তৈরি করা:

এখানে Foreign Key কনস্ট্রেইন্ট সেট করা হয়েছে, তাই মাইগ্রেশন তৈরি করতে হবে:

typeorm migration:generate -n AddForeignKeyConstraintToPost

এরপর মাইগ্রেশন রান করুন:

typeorm migration:run

এভাবে Foreign Key Constraint আপনার ডেটাবেসে যোগ হবে, যা Post টেবিলের userId কলামটিকে User টেবিলের id কলামের সাথে সম্পর্কিত করবে।


৩. Composite Unique Constraint

একাধিক কলামের সংমিশ্রণ (Combination) নিয়ে Unique Constraint তৈরি করতে হলে, @Unique ডেকোরেটর ব্যবহার করা হয়। এটি নিশ্চিত করে যে ঐ কলামগুলির সমন্বয়ে কোনো দুইটি রেকর্ড এক হতে পারবে না।

উদাহরণ: Composite Unique Constraint

ধরা যাক, আমাদের একটি User টেবিল আছে যেখানে firstName এবং lastName এর একসাথে ইউনিক হওয়া দরকার:

import { Entity, PrimaryGeneratedColumn, Column, Unique } from "typeorm";

@Unique(["firstName", "lastName"])
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;
}

এখানে, @Unique(["firstName", "lastName"]) দ্বারা আমরা নিশ্চিত করছি যে firstName এবং lastName এর একসাথে কোন দুটি রেকর্ড একই হতে পারবে না।


সারাংশ

TypeORM-এ Unique এবং Foreign Key কনস্ট্রেইন্ট ব্যবহার করে আপনি ডেটাবেসের ইন্টিগ্রিটি এবং ডেটা সম্পর্ক সুনিশ্চিত করতে পারেন। Unique Constraint একটি ফিল্ডের মধ্যে অনন্য মান রাখতে সাহায্য করে, এবং Foreign Key Constraint দুই টেবিলের মধ্যে সম্পর্ক নিশ্চিত করে। এগুলি ব্যবহার করে আপনি ডেটাবেসের ডিজাইন আরও শক্তিশালী এবং সঠিক করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...