乐闻世界logo
搜索文章和话题

How can I use raw SQL in NestJS instead of TypeOrm or Sequelize?

4 个月前提问
3 个月前修改
浏览次数10

1个答案

1

在 NestJS 中,虽然 TypeORM 和 Sequelize 是两个非常流行的 ORM 工具,但有时我们可能需要使用原始 SQL 来执行一些特定的数据库操作,以提高性能或处理复杂的查询。要在 NestJS 中使用原始 SQL,我们可以选择几种不同的方法。

方法1:使用数据库驱动直接连接

我们可以根据所使用的数据库类型(如 PostgreSQL, MySQL 等),直接使用对应的 Node.js 数据库驱动。以 PostgreSQL 为例,我们可以使用 pg 这个库来执行原始 SQL。

首先,需要安装 pg

bash
npm install pg

然后,我们可以在服务中创建一个数据库连接并执行查询:

typescript
import { Injectable } from '@nestjs/common'; import { Pool } from 'pg'; @Injectable() export class DatabaseService { private pool: Pool; constructor() { this.pool = new Pool({ user: 'yourUsername', host: 'localhost', database: 'yourDatabase', password: 'yourPassword', port: 5432, }); } async executeQuery(query: string) { const client = await this.pool.connect(); try { const result = await client.query(query); return result.rows; } finally { client.release(); } } }

在这个例子中,我们创建了一个 DatabaseService,它使用 pg.Pool 来管理连接。executeQuery 方法用于执行传入的 SQL 查询并返回结果。

方法2:使用第三方库

如果你不想直接处理底层数据库连接和查询,可以使用如 knex.js 这样的查询构建器库,它同时支持原始 SQL 和方便的方法来构建查询。

首先,安装 knex 和一个对应的数据库客户端(以 pg 为例):

bash
npm install knex pg

配置并使用 knex

typescript
import { Injectable } from '@nestjs/common'; import * as Knex from 'knex'; @Injectable() export class DatabaseService { private knex: Knex; constructor() { this.knex = Knex({ client: 'pg', connection: { host : '127.0.0.1', user : 'yourDatabaseUser', password : 'yourPassword', database : 'yourDatabaseName' } }); } async executeQuery(query: string) { return await this.knex.raw(query); } }

在这里,DatabaseService 使用 Knex 来执行原始 SQL。knex.raw() 方法允许你直接运行任何 SQL 代码。

结论

使用原始 SQL 在 NestJS 中不是非常复杂,你可以根据自己的需要选择合适的方法和库。直接使用数据库驱动提供了最大的控制和性能,而使用像 knex.js 这样的库则可以提供额外的便利性和安全性(如 SQL 注入保护)。选择哪种方法取决于你的具体需求和项目情况。

2024年6月29日 12:07 回复

你的答案