Nestjs教程使用TypeORM进行数据库操作
在使用NestJS和TypeORM进行数据库操作时遇到了一些问题:
-
如何在NestJS中正确配置TypeORM连接数据库?按照官方文档操作后仍然出现连接失败的提示。
-
使用TypeORM的Repository模式进行CRUD操作时,如何优雅地处理事务?有没有完整的示例可以参考?
-
实体关系(如一对一、一对多)在TypeORM中如何定义?尝试关联查询时总是返回不完整或错误的数据。
-
有没有推荐的方式在NestJS+TypeORM项目中实现数据库迁移?每次修改实体后都需要手动同步表结构很麻烦。
-
生产环境下如何优化TypeORM的数据库查询性能?发现一些复杂查询响应速度很慢。
3 回复
以下是一个简单的NestJS + TypeORM数据库操作教程:
-
初始化项目
使用Nest CLI创建项目:npm i -g [@nestjs](/user/nestjs)/cli nest new project-name cd project-name
-
安装依赖
安装TypeORM及相关模块:npm install typeorm [@nestjs](/user/nestjs)/typeorm mysql2
-
配置TypeORM
在src
目录下创建ormconfig.json
文件:{ "type": "mysql", "host": "localhost", "port": 3306, "username": "root", "password": "your-password", "database": "test_db", "entities": ["dist/**/*.entity{.ts,.js}"], "synchronize": true }
-
创建实体
创建一个User实体:touch src/user/user.entity.ts
内容如下:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; [@Entity](/user/Entity)() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() email: string; }
-
创建服务和控制器
生成服务和服务模块:nest generate service user nest generate controller user
实现基本的增删改查逻辑。
-
测试
启动应用:npm run start:dev
通过以上步骤,你可以完成一个简单的NestJS + TypeORM数据库操作示例。建议深入学习TypeORM文档以掌握更多高级功能。
以下是一个简单的NestJS + TypeORM数据库操作教程:
- 初始化项目:
npm i -g @nestjs/cli
nest new project-name
cd project-name
- 安装依赖:
npm install typeorm pg --save
npm install @nestjs/typeorm --save
pg
是PostgreSQL驱动,根据你的数据库选择对应驱动。
- 配置
app.module.ts
:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'your-username',
password: 'your-password',
database: 'your-db',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
],
})
export class AppModule {}
- 创建实体(Entity):
nest generate entity user
- 在控制器中操作数据库:
import { Controller, Get } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Controller('users')
export class UsersController {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
@Get()
async findAll(): Promise<User[]> {
return this.usersRepository.find();
}
}
运行npm run start:dev
即可测试。
NestJS 结合 TypeORM 是开发后端应用的常见组合,以下是简明教程:
1. 安装依赖
npm install @nestjs/typeorm typeorm mysql2 # 根据DB选择对应驱动
2. 配置模块
// app.module.ts
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 生产环境禁用
}),
],
})
export class AppModule {}
3. 创建实体
// user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
4. 服务层使用
// 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 usersRepository: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
create(user: User): Promise<User> {
return this.usersRepository.save(user);
}
}
5. 控制器示例
// user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get()
findAll() {
return this.userService.findAll();
}
@Post()
create(@Body() user: User) {
return this.userService.create(user);
}
}
关键点:
@Entity()
装饰器定义数据表结构@InjectRepository()
注入Repository- 常用Repository方法:find/save/update/delete
- 生产环境关闭
synchronize
,使用迁移
可以进一步配置:
- 关系(@OneToMany等)
- 事务管理
- 自定义Repository
- 数据验证