TypeORM কি?
TypeORM একটি আধুনিক এবং শক্তিশালী ORM (Object Relational Mapping) লাইব্রেরি, যা TypeScript এবং JavaScript (ES7) এর জন্য তৈরি করা হয়েছে। এটি ব্যবহারকারীদের ডেটাবেসের সাথে সহজভাবে যোগাযোগ করার জন্য মডেল, কুয়েরি এবং সম্পর্কিত ডেটা পরিচালনার সুবিধা দেয়। TypeORM-এ ডেটাবেসের সাথে কাজ করার জন্য আপনি সহজভাবে TypeScript ক্লাস ব্যবহার করতে পারেন, এবং এটি আপনাকে SQL কোড লেখার প্রয়োজন ছাড়াই ডেটাবেস অ্যাক্সেসের জন্য সঠিক মডেল তৈরি করতে সহায়তা করে।
TypeORM এর ডিরেক্টরি এবং ফাইল স্ট্রাকচার
TypeORM প্রজেক্ট তৈরি করার সময় কিছু নির্দিষ্ট ডিরেক্টরি এবং ফাইল স্ট্রাকচার ফলো করা হয়। সঠিক স্ট্রাকচার ব্যবহার করা প্রজেক্টের রক্ষণাবেক্ষণ এবং স্কেলেবিলিটি সহজ করে। সাধারণত TypeORM প্রজেক্টে কিছু মূল ডিরেক্টরি যেমন src/, entity/, migration/, controller/, service/ ইত্যাদি থাকে।
এখানে একটি সাধারণ TypeORM প্রজেক্টের ডিরেক্টরি এবং ফাইল স্ট্রাকচার দেওয়া হল:
১. src/ ডিরেক্টরি
এই ডিরেক্টরি মূল প্রজেক্টের কোড ধারণ করে। এখানে আপনি সার্ভিস, কন্ট্রোলার, এন্টিটি, রাউট এবং অন্যান্য লজিকাল ইউনিটের জন্য ফাইল সংরক্ষণ করবেন।
উদাহরণ:
src/
├── entity/
├── migration/
├── controller/
├── service/
├── app.ts
└── database.ts
২. entity/ ডিরেক্টরি
এন্টিটি (Entities) হল TypeORM-এর একটি গুরুত্বপূর্ণ অংশ। এখানে আপনি ডেটাবেস টেবিলের জন্য TypeScript ক্লাস তৈরি করবেন। প্রতিটি ক্লাস একটি টেবিলের প্রতিনিধিত্ব করে এবং এটিতে ডেটাবেসের কলাম এবং সম্পর্ক (যেমন, @OneToMany, @ManyToOne) থাকবে।
উদাহরণ:
src/
└── entity/
├── User.ts
└── Post.ts
User.ts Example:
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[];
}
Post.ts Example:
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
import { User } from './User';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToOne(() => User, user => user.posts)
user: User;
}
৩. migration/ ডিরেক্টরি
Migration ফাইলগুলি ডেটাবেস স্কিমা পরিবর্তন ট্র্যাক করতে ব্যবহৃত হয়। TypeORM আপনার ডেটাবেস টেবিল তৈরি করতে, পরিবর্তন করতে এবং মুছে ফেলতে মাইগ্রেশন ফাইলগুলি ব্যবহার করে। মাইগ্রেশনগুলি সাধারণত ডেটাবেসের অবস্থা পরিচালনা এবং আপডেট করার জন্য ব্যবহৃত হয়।
উদাহরণ:
src/
└── migration/
├── 1638482700000-CreateUserTable.ts
└── 1638483700000-CreatePostTable.ts
CreateUserTable.ts Example:
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
export class CreateUserTable1638482700000 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'user',
columns: [
{
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true,
generationStrategy: 'increment',
},
{
name: 'name',
type: 'varchar',
},
],
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('user');
}
}
৪. controller/ ডিরেক্টরি
Controllers সাধারণত API রিকোয়েস্ট পরিচালনা করে এবং এদের মধ্যে ব্যবহৃত সার্ভিসগুলির সাথে যোগাযোগ করে। এটি সাধারণত Express বা Fastify এর মতো ওয়েব ফ্রেমওয়ার্কের সাথে ব্যবহৃত হয়। কন্ট্রোলার রাউটগুলি ডিফাইন করে এবং ভিউ বা রেসপন্স প্রদান করে।
উদাহরণ:
src/
└── controller/
└── UserController.ts
UserController.ts Example:
import { Request, Response } from 'express';
import { UserService } from '../service/UserService';
export class UserController {
private userService = new UserService();
public async getUsers(req: Request, res: Response): Promise<Response> {
const users = await this.userService.getUsers();
return res.json(users);
}
}
৫. service/ ডিরেক্টরি
Services ডেটা লজিক বা ব্যবসায়িক লজিক পরিচালনা করে। কন্ট্রোলার একটি সার্ভিসে কল পাঠায় এবং সার্ভিসটি সেই ডেটা প্রক্রিয়া করে তারপর কন্ট্রোলারকে ফলাফল প্রদান করে। সার্ভিসে সাধারণত ডেটাবেস অপারেশন এবং ট্রান্সফরমেশন লজিক থাকে।
উদাহরণ:
src/
└── service/
└── UserService.ts
UserService.ts Example:
import { getRepository } from 'typeorm';
import { User } from '../entity/User';
export class UserService {
private userRepository = getRepository(User);
public async getUsers(): Promise<User[]> {
return this.userRepository.find();
}
}
৬. app.ts ফাইল
এটি আপনার অ্যাপ্লিকেশনটি শুরু করতে ব্যবহৃত হয় এবং সার্ভার কনফিগারেশন (যেমন Express সেটআপ) করার জন্য ব্যবহৃত হয়।
app.ts Example:
import express from 'express';
import { UserController } from './controller/UserController';
const app = express();
const userController = new UserController();
app.get('/users', userController.getUsers.bind(userController));
app.listen(3000, () => {
console.log('Server started on port 3000');
});
৭. database.ts ফাইল
এই ফাইলটি TypeORM এর জন্য কনফিগারেশন ও ডেটাবেস সংযোগ সেটআপ করতে ব্যবহৃত হয়।
database.ts Example:
import { createConnection } from 'typeorm';
createConnection()
.then(() => {
console.log('Connected to the database');
})
.catch((error) => console.log(error));
সারাংশ
TypeORM ব্যবহার করে একটি ভালোভাবে সংগঠিত এবং মডিউলার ফাইল স্ট্রাকচার তৈরি করা অনেক সুবিধা প্রদান করে। এতে:
entity/ডিরেক্টরিতে ডেটাবেস টেবিলের ক্লাস তৈরি করা হয়।migration/ডিরেক্টরিতে ডেটাবেস স্কিমা পরিবর্তন সংরক্ষণ করা হয়।controller/ডিরেক্টরিতে API রাউট এবং কন্ট্রোলার কোড থাকে।service/ডিরেক্টরিতে ব্যবসায়িক লজিক এবং ডেটাবেস অপারেশন থাকে।
এভাবে TypeORM ফাইল স্ট্রাকচারটি সহজেই স্কেল করা যায় এবং ডেটাবেস সংক্রান্ত কোডের রক্ষণাবেক্ষণ করা সহজ হয়ে ওঠে।
TypeORM কি?
TypeORM একটি জনপ্রিয় ORM (Object-Relational Mapping) লাইব্রেরি যা TypeScript এবং JavaScript এর জন্য তৈরি। এটি ডেটাবেসের সাথে কাজ করার জন্য সহজতর উপায় প্রদান করে, যেখানে SQL কোড লিখতে না হলেও ডেটাবেসের টেবিলগুলির সাথে ইন্টারঅ্যাক্ট করা যায়। TypeORM ডাটাবেসের সঠিক মডেলিং এবং ডেটাবেস কুয়েরি কার্যক্রম পরিচালনা করতে সাহায্য করে, যাতে ডেভেলপাররা ভালোভাবে ডেটাবেস পরিচালনা করতে পারেন।
TypeORM ব্যবহার করা প্রজেক্টের ফোল্ডার গঠন
একটি TypeORM প্রজেক্টে সাধারণত নিম্নলিখিত ফোল্ডার গঠন এবং ফাইল কাঠামো থাকে:
my-app/
│
├── dist/ # Transpiled output (compiled JavaScript files)
├── node_modules/ # Node.js modules
├── src/ # Source code
│ ├── controllers/ # Controllers (handle requests)
│ ├── entities/ # Entities (define database tables)
│ ├── migrations/ # Database migrations
│ ├── routes/ # Define all the routes
│ ├── services/ # Business logic
│ ├── utils/ # Utility functions
│ ├── app.ts # Entry point of the application
│ └── database.ts # Database connection setup
├── .env # Environment variables
├── .gitignore # Git ignore file
├── ormconfig.json # TypeORM configuration file
├── package.json # Project dependencies and scripts
└── tsconfig.json # TypeScript configuration file
প্রজেক্টের ফোল্ডার গঠন বিশ্লেষণ
- dist/:
এই ফোল্ডারটিsrc/থেকে কম্পাইল করা JavaScript ফাইল ধারণ করে। এটি TypeScript কোড কম্পাইল করার পর পাওয়া যায়। - node_modules/:
Node.js এর সমস্ত ডিপেনডেন্সি এই ফোল্ডারে থাকে। এটি npm install বা yarn চালানোর পর অটোমেটিকভাবে তৈরি হয়। - src/:
এটি প্রজেক্টের সোর্স কোডের জন্য মূল ফোল্ডার। এর মধ্যে সকল TypeScript ফাইল থাকে।controllers/:
এই ফোল্ডারে সমস্ত controller ফাইল রাখা হয় যা HTTP রিকোয়েস্ট এবং রেসপন্স হ্যান্ডল করে। এটি আপনার API এন্ডপয়েন্টের জন্য প্রয়োজনীয় লজিক ধারণ করে।উদাহরণ:
import { Request, Response } from 'express'; import { User } from '../entities/User'; export class UserController { async getAllUsers(req: Request, res: Response) { const users = await User.find(); return res.json(users); } }entities/:
TypeORM এর entity ফাইলগুলি এখানে থাকে, যা ডেটাবেস টেবিলগুলির কাঠামো নির্ধারণ করে। প্রতিটি entity একটি টেবিলের প্রতিনিধিত্ব করে এবং এটি ডেটাবেসের জন্য মডেল তৈরি করে।উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() email: string; }migrations/:
এই ফোল্ডারে ডেটাবেস মাইগ্রেশন ফাইল থাকে, যা ডেটাবেস স্কিমার পরিবর্তন ট্র্যাক করে এবং সেগুলি প্রয়োগ করার জন্য ব্যবহৃত হয়। TypeORM মাইগ্রেশন ব্যবহার করে আপনি আপনার ডেটাবেস স্কিমার পরিবর্তন করতে পারেন যেমন টেবিল তৈরি, কলাম যোগ করা ইত্যাদি।উদাহরণ:
npx typeorm migration:create -n CreateUserTableroutes/:
এই ফোল্ডারে রাউট সংক্রান্ত ফাইল রাখা হয়, যেখানে API রাউটগুলি ডিফাইন করা হয়। এটি controllers এর সাথে সম্পর্কিত থাকে।উদাহরণ:
import express from 'express'; import { UserController } from '../controllers/UserController'; const router = express.Router(); const userController = new UserController(); router.get('/users', userController.getAllUsers); export default router;services/:
Services হল ব্যবসায়িক লজিক এবং ডেটা প্রসেসিংয়ের জন্য ফাইল, যেখানে আপনি মডেলস, রেপোজিটরিজ এবং অন্যান্য ডেটাবেস অপারেশন পরিচালনা করেন।উদাহরণ:
import { User } from '../entities/User'; export class UserService { async createUser(name: string, email: string) { const user = new User(); user.name = name; user.email = email; await user.save(); } }- utils/:
এখানে সাধারণ সাহায্যকারী ফাংশন রাখা হয় যা কোডের পুনঃব্যবহারযোগ্য অংশ হতে পারে, যেমন ফাইল আপলোডের জন্য ইউটিলিটি বা লগিং ফাংশন। app.ts:
এটি অ্যাপ্লিকেশনটির এন্ট্রি পয়েন্ট। এখানে Express সার্ভার শুরু করা এবং রাউটগুলো যুক্ত করা হয়।উদাহরণ:
import express from 'express'; import { createConnection } from 'typeorm'; import userRoutes from './routes/userRoutes'; const app = express(); app.use(express.json()); createConnection().then(() => { app.listen(3000, () => { console.log('Server started on http://localhost:3000'); }); }); app.use('/api', userRoutes);database.ts:
এখানে TypeORM ডাটাবেস কনফিগারেশন এবং সংযোগ নির্ধারণ করা হয়।উদাহরণ:
import { createConnection } from 'typeorm'; createConnection({ type: 'postgres', host: 'localhost', port: 5432, username: 'test', password: 'test', database: 'test_db', entities: [ // Entities to be used ], synchronize: true, }).then(() => { console.log('Connected to the database'); }).catch(error => console.log('Error connecting to the database: ', error));
মূল কনফিগারেশন ফাইলসমূহ
ormconfig.json: TypeORM এর জন্য কনফিগারেশন ফাইল, যেখানে ডাটাবেস কনফিগারেশন এবং অন্যান্য মাইগ্রেশন/সিঙ্ক্রোনাইজেশন সেটিংস রাখা হয়।
উদাহরণ:
{ "type": "postgres", "host": "localhost", "port": 5432, "username": "test", "password": "test", "database": "test_db", "synchronize": true, "logging": false, "entities": [ "src/entities/*.ts" ], "migrations": [ "src/migrations/*.ts" ] }.env: এই ফাইলটি প্রজেক্টের পরিবেশের তথ্য ধারণ করে, যেমন ডাটাবেসের ইউজারনেম, পাসওয়ার্ড, হোস্ট, পোর্ট ইত্যাদি। এটি dotenv প্যাকেজের মাধ্যমে লোড করা হয়।
উদাহরণ:
DB_HOST=localhost DB_PORT=5432 DB_USERNAME=test DB_PASSWORD=test DB_DATABASE=test_dbpackage.json: আপনার প্রকল্পের ডিপেনডেন্সি এবং স্ক্রিপ্টের জন্য ব্যবহৃত হয়। TypeORM এবং অন্যান্য প্রয়োজনীয় প্যাকেজ এখানে অন্তর্ভুক্ত থাকে।
উদাহরণ:
{ "name": "typeorm-project", "version": "1.0.0", "main": "dist/app.js", "scripts": { "start": "ts-node src/app.ts", "build": "tsc", "migration:run": "typeorm migration:run" }, "dependencies": { "typeorm": "^0.2.34", "express": "^4.17.1", "pg": "^8.5.1", "reflect-metadata": "^0.1.13" }, "devDependencies": { "typescript": "^4.1.3", "ts-node": "^9.1.1" } }tsconfig.json: TypeScript কনফিগারেশন ফাইল, যেখানে TypeScript কম্পাইলার সেটিংস রাখা হয়।
উদাহরণ:
{ "compilerOptions": { "target": "ES6", "module": "commonjs", "lib": ["es6", "es2017"], "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "outDir": "./dist" }, "include": ["src/**/*"] }
সারাংশ
TypeORM ব্যবহার করে তৈরি একটি প্রজেক্টে বিভিন্ন গুরুত্বপূর্ণ ফোল্ডার এবং কনফিগারেশন ফাইল থাকে। এর মধ্যে entities/, controllers/, services/, এবং migrations/ ফোল্ডারগুলো ডেটাবেস ম্যানেজমেন্ট, API রাউটিং, এবং ব্যবসায়িক লজিককে সাজানোর জন্য ব্যবহৃত হয়। ormconfig.json, .env, এবং tsconfig.json ফাইলগুলো ডাটাবেস সংযোগ, পরিবেশ সেটিংস এবং TypeScript কনফিগারেশন ম্যানেজ করতে সাহায্য করে। TypeORM-এ ডেটাবেস পরিচালনা এবং মাইগ্রেশন সহজ করার জন্য এই ফোল্ডার গঠন এবং ফাইল কাঠামো অত্যন্ত গুরুত্বপূর্ণ।
টাইপওআরএম (TypeORM) পরিচিতি
TypeORM হল একটি শক্তিশালী ORM (Object-Relational Mapping) লাইব্রেরি যা TypeScript এবং JavaScript এর জন্য তৈরি করা হয়েছে। এটি ডাটাবেস ম্যানিপুলেশন, ডাটাবেস টেবিল ও সম্পর্কের মডেলিং এবং SQL কোড লেখার ক্ষেত্রে অনেক সাহায্য করে। TypeORM ব্যবহার করে আপনি ডাটাবেসের সাথে যোগাযোগ করতে পারবেন, মডেলগুলিকে ডিফাইন করতে পারবেন এবং SQL কোড কমপ্লেক্সিটি কমিয়ে ডেটা পরিচালনা সহজ করতে পারবেন।
TypeORM-এর কনফিগারেশন সাধারণত দুটি ফাইলের মাধ্যমে করা হয়:
ormconfig.json: JSON ফরম্যাটে ডাটাবেস কনফিগারেশন ফাইল।data-source.ts: TypeScript ফাইল, যা TypeORM কনফিগারেশন, ডাটাবেস সংযোগ এবং ডাটাবেসে মডেল ফিচারগুলো পরিচালনা করে।
ormconfig.json কনফিগারেশন ফাইল
ormconfig.json ফাইলটি TypeORM ডাটাবেসের কনফিগারেশন এবং সেটিংস সংরক্ষণ করতে ব্যবহৃত হয়। সাধারণত এই ফাইলটিতে ডাটাবেসের সংযোগ সেটিংস যেমন host, port, username, password, database name, এবং অন্যান্য কনফিগারেশন টুকরা থাকে।
ormconfig.json ফাইলের উদাহরণ:
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "yourpassword",
"database": "testdb",
"synchronize": true,
"logging": true,
"entities": [
"src/entity/**/*.ts"
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
"cli": {
"migrationsDir": "src/migration"
}
}
কনফিগারেশন ফাইলের বর্ণনা:
type: ডাটাবেসের ধরনের (যেমন,postgres,mysql,sqlite, ইত্যাদি)।host: ডাটাবেস সার্ভারের হোস্ট (যেমন,localhost, বা ডাটাবেস সার্ভারের IP ঠিকানা)।port: ডাটাবেস সার্ভারের পোর্ট (যেমন,5432PostgreSQL এর জন্য)।username: ডাটাবেস লগিন ইউজারনেম।password: ডাটাবেস ইউজারের পাসওয়ার্ড।database: ডাটাবেসের নাম।synchronize: যদিtrueহয়, TypeORM ডাটাবেসের টেবিল স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করবে।logging: যদিtrueহয়, TypeORM SQL কোয়েরি লোগ করবে।entities: ডাটাবেস মডেল বা এন্টিটিজি যেখানে রয়েছে। এখানে টেবিলের ক্লাসগুলোর পাথ দিতে হবে।migrations: মাইগ্রেশন ফাইলের অবস্থান।subscribers: সাবস্ক্রাইবার ফাইলের অবস্থান (যেগুলি ইভেন্ট হ্যান্ডলিং এর জন্য ব্যবহৃত হয়)।cli: TypeORM CLI টুলের জন্য মাইগ্রেশন ফাইলের ডিরেক্টরি।
data-source.ts কনফিগারেশন ফাইল (TypeScript)
TypeORM 0.3.x এর পর, data-source.ts ফাইলটি ormconfig.json এর বিকল্প হিসেবে ব্যবহৃত হচ্ছে। এতে TypeScript এর সাহায্যে ডাটাবেস সংযোগ এবং মডেল সেটআপ করা হয়। এটি একটি DataSource ইনস্ট্যান্স তৈরি করে, যেটি ডাটাবেসের সাথে যোগাযোগ এবং মডেল সংযোগ ব্যবস্থাপনা করে।
data-source.ts ফাইলের উদাহরণ:
import { DataSource } from "typeorm";
import { User } from "./entity/User"; // মডেল ইম্পোর্ট
import { Post } from "./entity/Post"; // মডেল ইম্পোর্ট
export const AppDataSource = new DataSource({
type: "postgres",
host: "localhost",
port: 5432,
username: "postgres",
password: "yourpassword",
database: "testdb",
synchronize: true,
logging: true,
entities: [User, Post],
migrations: [],
subscribers: [],
});
AppDataSource.initialize()
.then(() => {
console.log("Data Source has been initialized!");
})
.catch((error) => {
console.log("Error during Data Source initialization:", error);
});
data-source.ts কনফিগারেশন ফাইলের বর্ণনা:
AppDataSource: এখানে ডাটাবেস সংযোগ স্থাপন করা হয়। এটিDataSourceকনস্ট্রাক্টর দ্বারা তৈরি হয়, যা ডাটাবেস সংযোগ এবং ডাটাবেস সম্পর্কিত ফাংশনগুলি পরিচালনা করে।entities: ডাটাবেসের টেবিলগুলোকে TypeORM মডেল (এন্টিটি) হিসেবে ইম্পোর্ট এবং যুক্ত করা হয়।synchronize: যদিtrueহয়, TypeORM ডাটাবেস টেবিলগুলোকে মডেল অনুযায়ী স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করে।logging: যদিtrueহয়, TypeORM SQL কোয়েরি লোগ করবে।
AppDataSource.initialize() ফাংশনটি ডাটাবেস সংযোগ এবং সেটআপ প্রক্রিয়া শুরু করে।
ormconfig.json বনাম data-source.ts
| বৈশিষ্ট্য | ormconfig.json | data-source.ts |
|---|---|---|
| ফাইল টাইপ | JSON | TypeScript |
| কনফিগারেশন সিস্টেম | স্ট্যাটিক (JSON ফাইল) | ডাইনামিক (TypeScript কোড) |
| ব্যবহার | সহজ এবং ক্লাসিক কনফিগারেশন | TypeScript ডেভেলপমেন্টের জন্য বেশি উপযোগী |
| সামর্থ্য | সীমিত কাস্টমাইজেশন | উন্নত কাস্টমাইজেশন এবং প্রোগ্রাম্যাটিক কনফিগারেশন |
| আধুনিক ব্যবহার | পুরানো ভার্সনে ব্যবহৃত | TypeORM 0.3.x এবং পরবর্তী সংস্করণে ব্যবহৃত |
| ডেভেলপমেন্ট ফ্লো | সোজা এবং সরল | TypeScript এবং অ্যাডভান্সড সেটআপের জন্য উপযুক্ত |
সারাংশ
ormconfig.jsonএবংdata-source.tsউভয়ই TypeORM এর ডাটাবেস কনফিগারেশন পরিচালনার জন্য ব্যবহৃত হয়, তবে নতুন সংস্করণেdata-source.tsঅধিক ব্যবহৃত হচ্ছে।ormconfig.jsonহল একটি স্ট্যাটিক JSON ফাইল যেখানে ডাটাবেস কনফিগারেশন লিখা হয়, যা সাধারিতভাবে TypeORM 0.2.x সংস্করণে ব্যবহৃত হয়।data-source.tsহল একটি TypeScript ফাইল যেখানে TypeORM ডাটাবেস কনফিগারেশন প্রোগ্রাম্যাটিকভাবে লেখা হয় এবং এটি TypeORM 0.3.x সংস্করণ থেকে ব্যবহৃত হয়।
এটি আপনার প্রকল্পের প্রয়োজন অনুসারে ডেটাবেস কনফিগারেশন ব্যবস্থাপনার জন্য সঠিক ফাইল নির্বাচন করতে সাহায্য করবে।
টাইপওআরএম (TypeORM) কী?
TypeORM একটি আধুনিক এবং পূর্ণাঙ্গ ORM (Object-Relational Mapping) লাইব্রেরি যা TypeScript এবং JavaScript-এ রিলেশনাল ডাটাবেসের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে। TypeORM এর মাধ্যমে আপনি ডাটাবেস টেবিলগুলিকে Entities (ক্লাস হিসেবে) প্রতিনিধিত্ব করতে পারেন এবং সেগুলোর উপর CRUD (Create, Read, Update, Delete) অপারেশন করতে পারেন।
TypeORM ডাটাবেস ম্যানেজমেন্টের জন্য একটি সিস্টেম প্রদান করে যা Entities, Repositories, এবং Migrations ধারণা ব্যবহার করে ডাটাবেসের স্ট্রাকচার এবং ডেটা পরিচালনা করতে সাহায্য করে।
Entities, Migrations, Repositories এর ফোল্ডার ব্যবস্থাপনা
TypeORM প্রজেক্টে ফোল্ডার স্ট্রাকচার সঠিকভাবে পরিচালনা করা কোডের রক্ষণাবেক্ষণ সহজ করে এবং নতুন ফিচার সংযোজন সহজ করে তোলে। এটি সিস্টেমের স্কেলেবিলিটি এবং উন্নয়ন প্রক্রিয়া দ্রুত করে।
১. Entities
Entities হল TypeORM-এর ক্লাস, যা ডাটাবেসের টেবিল প্রতিনিধিত্ব করে। প্রতিটি Entity একটি ডাটাবেস টেবিলের জন্য একটি ক্লাস এবং এতে প্রপার্টি হিসেবে টেবিলের কলাম থাকে।
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 কলাম হিসেবে ব্যবহার হবে।
Entities ফোল্ডার স্ট্রাকচার:
প্রতিটি Entity সাধারণত একটি পৃথক ফাইল হিসাবে রাখা হয়। ফোল্ডার স্ট্রাকচারে entities নামক একটি ডিরেক্টরি তৈরি করুন এবং এর মধ্যে প্রতিটি Entity এর ফাইল সংরক্ষণ করুন।
src/
├── entities/
│ ├── User.ts
│ ├── Product.ts
│ └── Order.ts
২. Migrations
Migrations হল ডাটাবেস স্কিমা পরিবর্তনগুলি সিস্টেম্যাটিকভাবে ট্র্যাক করার এবং পরিচালনা করার উপায়। যখন আপনি একটি Entity তৈরি করেন বা Entity এর স্কিমা পরিবর্তন করেন, তখন মাইগ্রেশন ব্যবহার করে ডাটাবেসে সেই পরিবর্তনটি প্রতিফলিত করতে পারেন।
Migration উদাহরণ:
typeorm migration:create -n CreateUserTable
এটি একটি মাইগ্রেশন ফাইল তৈরি করবে। এরপর, আপনি নতুন Entity এর স্কিমা অনুযায়ী মাইগ্রেশন ফাইলটি সম্পাদনা করতে পারেন।
import {MigrationInterface, QueryRunner} from "typeorm";
export class CreateUserTable1628084412629 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE "user" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "email" character varying NOT NULL, CONSTRAINT "PK_0d8a1d9e47b2368be7bcd8e087d" PRIMARY KEY ("id"))`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE "user"`);
}
}
এখানে, up মেথডে আপনি ডাটাবেসের পরিবর্তন (টেবিল তৈরি করা) করবেন এবং down মেথডে আপনি সেই পরিবর্তনটি রিভার্স (ডিলিট করা) করবেন।
Migrations ফোল্ডার স্ট্রাকচার:
src/
├── migrations/
│ ├── 1628084412629-CreateUserTable.ts
│ ├── 1628084612630-CreateProductTable.ts
│ └── 1628084812631-CreateOrderTable.ts
মাইগ্রেশন ফাইলগুলো সময়ক্রমে সঠিকভাবে নামকরণ করা হয় যাতে সহজেই ট্র্যাক করা যায়।
৩. Repositories
Repositories হল TypeORM-এর এমন একটি ফিচার যা ডাটাবেসে অ্যাক্সেস করতে এবং Entity সম্পর্কিত কাস্টম কুয়েরি পরিচালনা করতে ব্যবহৃত হয়। Repositories Entity এর জন্য CRUD অপারেশন সম্পাদন করতে সাহায্য করে।
Repository উদাহরণ:
import { EntityRepository, Repository } from "typeorm";
import { User } from "../entities/User";
@EntityRepository(User)
export class UserRepository extends Repository<User> {
// Custom methods can be added here
async findUserByEmail(email: string): Promise<User | undefined> {
return this.findOne({ email });
}
}
এখানে, UserRepository একটি কাস্টম রিপোজিটরি, যা User Entity এর জন্য কাস্টম কুয়েরি মেথড যোগ করে।
Repositories ফোল্ডার স্ট্রাকচার:
src/
├── repositories/
│ ├── UserRepository.ts
│ ├── ProductRepository.ts
│ └── OrderRepository.ts
এখানে, প্রতিটি Entity এর জন্য একটি আলাদা Repository রাখা হয়।
ফোল্ডার ব্যবস্থাপনা কৌশল
ফোল্ডার স্ট্রাকচারটি একটি প্রজেক্টের স্কেল এবং রক্ষণাবেক্ষণ সহজ করার জন্য গুরুত্বপূর্ণ। Entities, Migrations, এবং Repositories এর জন্য একটি পরিষ্কার এবং সুসংহত ফোল্ডার স্ট্রাকচার গঠন করা কোডের মান বজায় রাখতে সহায়তা করে।
সাধারণ TypeORM ফোল্ডার স্ট্রাকচার:
src/
├── entities/
│ ├── User.ts
│ ├── Product.ts
│ └── Order.ts
├── migrations/
│ ├── 1628084412629-CreateUserTable.ts
│ └── 1628084612630-CreateProductTable.ts
├── repositories/
│ ├── UserRepository.ts
│ ├── ProductRepository.ts
│ └── OrderRepository.ts
├── controllers/
│ └── UserController.ts
├── services/
│ └── UserService.ts
├── app.ts
এখানে:
- entities/: ডাটাবেস টেবিল প্রতিনিধিত্বকারী ফাইলগুলির জন্য।
- migrations/: ডাটাবেস স্কিমা পরিবর্তনের জন্য মাইগ্রেশন ফাইল।
- repositories/: Entity এর জন্য কাস্টম ডাটাবেস অপারেশন পরিচালনা করার জন্য।
- controllers/: রাউট এবং কন্ট্রোলার ক্লাস।
- services/: বিজনেস লজিক এবং সার্ভিস ক্লাস।
সারাংশ
TypeORM ব্যবহার করার সময়, Entities, Migrations, এবং Repositories এর জন্য একটি পরিষ্কার ফোল্ডার স্ট্রাকচার তৈরি করা অত্যন্ত গুরুত্বপূর্ণ। এতে করে আপনার প্রজেক্টের স্কেল, রক্ষণাবেক্ষণ এবং টেস্টিং সহজ হবে। Entities ডাটাবেসের টেবিল প্রতিনিধিত্ব করে, Migrations ডাটাবেসের স্কিমা পরিবর্তন করে, এবং Repositories ডাটাবেসে কাস্টম অপারেশন পরিচালনা করতে সহায়তা করে। TypeORM এর মাধ্যমে আপনি মডিউলার, স্কেলেবল এবং পুনঃব্যবহারযোগ্য কোড লিখতে পারবেন যা সিস্টেমের স্থিতিশীলতা এবং কার্যকারিতা উন্নত করবে।
TypeORM CLI কি?
TypeORM CLI হল একটি কমান্ড-লাইন টুল যা TypeORM ব্যবহারকারীদের ডেটাবেস ম্যানেজমেন্ট এবং মাইগ্রেশন কাজগুলিকে আরও সহজ এবং কার্যকরী করতে সহায়তা করে। TypeORM CLI এর মাধ্যমে আপনি ডেটাবেসের কাঠামো তৈরি, মাইগ্রেশন চালানো, এবং অন্যান্য উন্নত ডেটাবেস সম্পর্কিত কাজ সহজেই পরিচালনা করতে পারেন। এটি TypeORM প্রজেক্টে ডেটাবেসের সাথে কাজ করার সময় অনেক সময় এবং প্রচেষ্টা সাশ্রয় করে।
TypeORM CLI এর ফিচার
TypeORM CLI দিয়ে আপনি নিচের কাজগুলো করতে পারবেন:
- ডাটাবেস কনফিগারেশন: ডেটাবেস তৈরি এবং কনফিগারেশন করা।
- এন্টিটি জেনারেশন: ডাটাবেস টেবিলের জন্য TypeORM এন্টিটি তৈরি করা।
- মাইগ্রেশন: ডেটাবেস স্কিমার পরিবর্তন ট্র্যাক এবং অ্যাপ্লাই করা।
- ডাটাবেস সিঙ্ক্রোনাইজেশন: ডাটাবেসের কাঠামো স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করা।
- কনফিগারেশন টেমপ্লেট: TypeORM প্রজেক্টের জন্য কনফিগারেশন ফাইল তৈরি করা।
TypeORM CLI ইনস্টলেশন
প্রথমে TypeORM এবং CLI ইনস্টল করতে হবে। নিচে TypeORM এবং CLI ইনস্টল করার স্টেপ দেওয়া হলো:
- TypeORM এবং CLI ইনস্টল করুন:
npm install typeorm --save
npm install ts-node --save-dev
npm install @nestjs/cli --save-dev
- TypeORM কনফিগারেশন ফাইল তৈরি করুন:
প্রজেক্টের রুট ডিরেক্টরিতে ormconfig.json নামের একটি কনফিগারেশন ফাইল তৈরি করুন। এই ফাইলটি TypeORM ক্লায়েন্ট কনফিগারেশন এবং ডেটাবেসের সেটিংস রাখবে।
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "password",
"database": "test_db",
"synchronize": true,
"logging": false,
"entities": [
"src/entity/*.ts"
],
"migrations": [
"src/migration/*.ts"
],
"subscribers": [
"src/subscriber/*.ts"
],
"cli": {
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}
এখানে, আমরা PostgreSQL ডেটাবেসের কনফিগারেশন ব্যবহার করেছি, তবে আপনি আপনার প্রোজেক্টের প্রয়োজন অনুযায়ী অন্য যেকোনো ডেটাবেস কনফিগারেশন ব্যবহার করতে পারেন।
TypeORM CLI কমান্ড
TypeORM CLI ব্যবহার করতে হলে আপনার প্রজেক্টের মধ্যে কিছু কমান্ড চালাতে হবে। নিচে TypeORM CLI-এর কিছু গুরুত্বপূর্ণ কমান্ড দেওয়া হলো:
১. ডাটাবেস মাইগ্রেশন তৈরি করা (migration:generate)
মাইগ্রেশন কমান্ডটি ডেটাবেসের মধ্যে নতুন পরিবর্তন বা স্কিমা যুক্ত করতে ব্যবহৃত হয়। নতুন মাইগ্রেশন ফাইল তৈরি করার জন্য নিচের কমান্ডটি ব্যবহার করতে হবে।
npx typeorm migration:generate -n MigrationName
এটি ডেটাবেস স্কিমার পরিবর্তন ট্র্যাক করবে এবং MigrationName নামে একটি নতুন মাইগ্রেশন ফাইল তৈরি করবে।
২. মাইগ্রেশন চালানো (migration:run)
ডেটাবেসের বর্তমান স্কিমা অনুযায়ী পরিবর্তনগুলি অ্যাপ্লাই করতে migration:run কমান্ড ব্যবহার করা হয়।
npx typeorm migration:run
এটি পূর্ববর্তী মাইগ্রেশন ফাইল থেকে সব পরিবর্তন ডেটাবেসে প্রয়োগ করবে।
৩. মাইগ্রেশন রিভার্স করা (migration:revert)
যদি আপনি আগের মাইগ্রেশনটি রিভার্স করতে চান, তবে migration:revert কমান্ড ব্যবহার করুন।
npx typeorm migration:revert
এটি পূর্ববর্তী মাইগ্রেশন ফাইলটির পরিবর্তনগুলি ব্যাকআউট করবে।
৪. এন্টিটি তৈরি করা (entity:create)
এন্টিটি তৈরি করতে typeorm entity:create কমান্ড ব্যবহার করা হয়।
npx typeorm entity:create --name User
এটি একটি নতুন User এন্টিটি তৈরি করবে এবং src/entity ডিরেক্টরিতে সেই এন্টিটি ফাইল সংরক্ষণ করবে।
৫. ডাটাবেস সিঙ্ক্রোনাইজেশন (schema:sync)
ডেটাবেসের স্কিমা সিঙ্ক্রোনাইজ করতে schema:sync কমান্ড ব্যবহার করা হয়। এটি ডেটাবেসের সঠিক কাঠামো তৈরি বা আপডেট করে।
npx typeorm schema:sync
এটি ডেটাবেসের কাঠামো (যেমন টেবিল, কলাম) TypeORM মডেলের সাথে সিঙ্ক্রোনাইজ করে।
৬. ডাটাবেস থেকে ডেটা ডাম্প বা সেভ করা (query:run)
SQL কুয়েরি চালানোর জন্য query:run কমান্ড ব্যবহার করা যেতে পারে।
npx typeorm query:run "SELECT * FROM users"
এটি users টেবিলের সব ডেটা রিটার্ন করবে।
TypeORM CLI এর সাহায্যে কাস্টম মাইগ্রেশন তৈরি করা
আপনি যখন ডেটাবেসে কোনও পরিবর্তন করতে চান (যেমন নতুন কলাম, টেবিল, কনস্ট্রেইন্ট যোগ করা), তখন TypeORM CLI মাইগ্রেশন তৈরি করে তা ডেটাবেসে প্রয়োগ করার সুযোগ দেয়।
১. মাইগ্রেশন তৈরি:
প্রথমে একটি মাইগ্রেশন তৈরি করুন:
npx typeorm migration:generate -n AddUserAgeColumn
২. মাইগ্রেশন ফাইল আপডেট:
এটি একটি নতুন ফাইল তৈরি করবে যেখানে ডেটাবেস পরিবর্তন করার জন্য প্রয়োজনীয় কোড থাকবে। উদাহরণস্বরূপ:
import {MigrationInterface, QueryRunner} from "typeorm";
export class AddUserAgeColumn1616161616161 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" ADD "age" integer`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "age"`);
}
}
এই মাইগ্রেশন ফাইলটি নতুন age কলাম যোগ করবে।
৩. মাইগ্রেশন চালানো:
এখন এই মাইগ্রেশনটি ডেটাবেসে অ্যাপ্লাই করতে:
npx typeorm migration:run
এটি age কলামটি user টেবিলে যোগ করবে।
TypeORM CLI এর মধ্যে কনফিগারেশন ফাইলের গুরুত্ব
TypeORM CLI ব্যবহারের ক্ষেত্রে কনফিগারেশন ফাইল গুরুত্বপূর্ণ ভূমিকা পালন করে। TypeORM এর কনফিগারেশন ফাইলটি সাধারণত ormconfig.json বা ormconfig.ts নামে থাকে এবং এতে ডেটাবেস সংযোগের বিস্তারিত তথ্য থাকে, যেমন ডেটাবেসের টাইপ, নাম, পাসওয়ার্ড, হোস্ট, এবং অন্যান্য সেটিংস।
উদাহরণ:
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "password",
"database": "test_db",
"entities": ["src/entity/*.ts"],
"synchronize": true,
"migrations": ["src/migration/*.ts"],
"cli": {
"entitiesDir": "src/entity",
"migrationsDir": "src/migration"
}
}
এই কনফিগারেশন ফাইলের মাধ্যমে TypeORM CLI ডেটাবেসের সাথে সংযোগ স্থাপন করে এবং বিভিন্ন মাইগ্রেশন অপারেশন পরিচালনা করে।
সারাংশ
TypeORM CLI ডেটাবেস ম্যানেজমেন্ট এবং মাইগ্রেশনকে সহজ করে তোলে, যা ডেভেলপারদের ডেটাবেসের কাঠামো পরিবর্তন, টেবিল তৈরি, এবং স্কিমার সংশোধন দ্রুত এবং সহজভাবে পরিচালনা করতে সহায়তা করে। CLI কমান্ডগুলি যেমন migration:generate, migration:run, এবং entity:create ডেভেলপারদের ডেটাবেসের কার্যক্রমগুলো সহজেই পরিচালনা করতে সহায়তা করে, যা তাদের কাজের গতি এবং কার্যকারিতা উন্নত করে।
Read more