在 NestJS 中,虽然 TypeORM 和 Sequelize 是两个非常流行的 ORM 工具,但有时我们可能需要使用原始 SQL 来执行一些特定的数据库操作,以提高性能或处理复杂的查询。要在 NestJS 中使用原始 SQL,我们可以选择几种不同的方法。
方法1:使用数据库驱动直接连接
我们可以根据所使用的数据库类型(如 PostgreSQL, MySQL 等),直接使用对应的 Node.js 数据库驱动。以 PostgreSQL 为例,我们可以使用 pg
这个库来执行原始 SQL。
首先,需要安装 pg
:
bashnpm install pg
然后,我们可以在服务中创建一个数据库连接并执行查询:
typescriptimport { 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
为例):
bashnpm install knex pg
配置并使用 knex
:
typescriptimport { 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 回复