If tutorials available on this website are helpful for you, please whitelist this website in your ad blocker😭 or Donate to help us ❤️ pay for the web hosting to keep the website running.
NestJS में MySQL database के साथ MySQL2
driver का use करके records को select
करना एक common operation है। NestJS के साथ TypeORM और MySQL2 driver का use करके आप easily SELECT
queries को handle कर सकते हैं।
TypeORM के साथ आपको manually SQL queries लिखने कि need नहीं होती, आप entities का use करके object-oriented तरीके से अपने database से records fetch कर सकते हैं।
इस topic में हम देखेंगे कैसे आप NestJS के साथ MySQL2 driver का use करते हुए database से records को select कर सकते हैं, कैसे TypeORM के साथ MySQL को integrate करना है, और कैसे select queries को efficiently handle करना है।
अगर आपने अपने NestJs Project में mysql2 package setup नहीं किया तो कर ले।
●●●
NestJS में entities
को use करके database के tables
को define किया जाता है। हर entity एक class
होती है जो MySQL table के columns को represent करती है।
चलिए एक User entity बनाते हैं जो users
table को represent करेगा।
File : src/user/user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column({ unique: true })
email: string;
@Column()
password: string;
}
NestJS CLI का use करके UserService
और UserController
generate करें
nest g service user nest g controller user
अब हम UserService
में method लिखते हैं जो सभी users को database से fetch करेगा।
File : src/user/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
async findAll(): Promise<User[]> {
return this.userRepository.find(); // Select * from users
}
async findOne(id: number): Promise<User> {
return this.userRepository.findOneBy({ id }); // Select * from users where id = ?
}
}
यहां -
userRepository.find()
का use करके हम सभी users को select कर रहे हैं।
userRepository.findOneBy()
का use करके हम एक specific user को उसके id के basis पर select कर रहे हैं।
UserController : src/user/user.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get()
getAllUsers(): Promise<User[]> {
return this.userService.findAll();
}
@Get(':id')
getUserById(@Param('id') id: number): Promise<User> {
return this.userService.findOne(id);
}
}
यहां
@Get()
decorator का use करके हम GET request के through data fetch कर रहे हैं।
@Param('id')
का use करके URL से id को extract कर रहे हैं और उसके basis पर user fetch कर रहे हैं।
●●●
अगर आप TypeORM
का use नहीं करना चाहते और directly MySQL2 driver के through queries
run करना चाहते हैं, तो आप MySQL2 driver को use करके raw SQL queries लिख सकते हैं।
अब हम direct MySQL2 connection setup करते हैं।
File : src/app.module.ts
import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';
import * as mysql from 'mysql2/promise';
@Module({
imports: [UserModule],
providers: [
{
provide: 'MYSQL_CONNECTION',
useFactory: async () => {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'nest_db',
});
return connection;
},
},
],
})
export class AppModule {}
यहां अगर ध्यान दें तो हमने MySQL2 का connection TypeOrmModule
का use न करके mysql2/promise
का use करके manually setup किया है।
अब हम इस MySQL2
connection को inject करके raw SQL query लिखेंगे ताकि database से records select कर सकें।
Location : src/user/user.service.ts
import { Injectable, Inject } from '@nestjs/common';
import { Connection } from 'mysql2/promise';
@Injectable()
export class UserService {
constructor(
@Inject('MYSQL_CONNECTION') private connection: Connection,
) {}
async findAll(): Promise<any[]> {
const [rows] = await this.connection.query('SELECT * FROM users');
return rows;
}
async findOne(id: number): Promise<any> {
const [rows] = await this.connection.query('SELECT * FROM users WHERE id = ?', [id]);
return rows[0];
}
}
यहां
connection.query()
का use करके raw SQL query लिखी गयी है जो MySQL से data select कर रही है।
हम findAll()
और findOne()
methods के through records return
कर रहे हैं।
इस तरह से records select करने पर हमें entity
class की need नहीं पड़ती क्योंकि records को directly raw query से select कर रहे है।
अगर आप ये method से records select करना चाहते हैं तो अच्छा होगा कि आप data fetch करने के लिए एक helper class बना ले जो आपके हर तरह की table से records fetch करने में help करेगा।
●●●
TypeORM में आप Query Builder का use करके भी complex queries लिख सकते हैं। Query builder का use तब होता है जब आपको complex joins या custom queries लिखनी हो।
async findAllWithQueryBuilder(): Promise<User[]> {
return this.userRepository.createQueryBuilder('user')
.select(['user.id', 'user.name', 'user.email'])
.getMany();
}
यहां
createQueryBuilder()
का use करके हम custom select
query लिख रहे हैं।
इसमें आप getMany()
का use करके multiple records fetch करते हैं।
●●●
Use DTOs : जब आप data को client से accept करते हैं, तो DTOs का use करें data validation और sanitization के लिए।
Error Handling : जब आप database queries run करते हैं, तो proper error handling implement करें, जैसे अगर record नहीं मिलता तो NotFoundException
throw करें।
Avoid SQL Injection : अगर आप raw SQL queries लिख रहे हैं (using MySQL2 driver), तो parameterized queries का use करें ताकि SQL injection attacks को avoid किया जा सके।
Pagination for Large Datasets : अगर आप large datasets handle कर रहे हैं, तो pagination का use करें ताकि performance और efficiency maintain रहे।
Use Transactions for Multiple Queries : अगर आप multiple queries एक साथ run कर रहे हैं जो interdependent हैं, तो transactions का use करें।