📅  最后修改于: 2023-12-03 15:05:39.148000             🧑  作者: Mango
TypeORM是一个强大的ORM框架,不仅支持TypeScript和JavaScript,还支持多种关系型数据库,如MySQL、PostgreSQL、Oracle等。在TypeORM中,我们可以使用TypeScript编写ORM实体类,这样可以减少手写数据库查询语句的工作量。不过有时候我们也需要自己编写一些原始的SQL语句来完成一些比较复杂的查询操作。这时候就需要使用TypeORM提供的原始SQL功能了。本文将对TypeORM的原始SQL功能进行详细介绍。
TypeORM提供了两种方式来执行原始SQL语句:
下面我们分别介绍这两种用法。
执行查询的方法是query()
,它接受一个原始的SQL语句,返回查询结果。例如:
const users = await connection.query("SELECT * FROM users");
console.log(users);
在这里,我们执行了一个查询,获取了users
表中的所有记录。这些记录将存储在users
变量中。
执行修改的方法是queryRunner.query()
,它接受一个原始的SQL语句,返回影响的行数。例如:
await connection.transaction(async (manager) => {
const queryRunner = manager.queryRunner;
const result = await queryRunner.query("UPDATE users SET firstName = 'NewName' WHERE id = 1");
console.log(result);
});
在这里,我们执行了一个修改命令,将users
表中id
为1的记录的firstName
字段修改为NewName
。修改后的记录数量将存储在result
变量中。
在编写原始SQL语句时,我们需要考虑SQL注入攻击的问题。为了避免这种攻击,我们可以使用参数化查询。
参数化查询是指将变量和查询语句分开处理,这样可以防止恶意用户在变量中嵌入SQL代码。在TypeORM中,我们可以使用query()
方法的第二个参数来指定查询参数。例如:
const userId = 1;
const user = await connection.query("SELECT * FROM users WHERE id = $1", [userId]);
console.log(user);
在这里,我们执行了一个查询,查询users
表中id
为1的记录。查询中使用了$1
来代替变量userId
,[userId]
数组为查询参数。
TypeORM的原始SQL功能可以让我们灵活地编写复杂的查询语句和修改命令。在使用时,我们需要注意避免SQL注入攻击,可以使用参数化查询来解决这个问题。