Typeorm: Execute raw query with parameters

2 min read 06-10-2024
Typeorm: Execute raw query with parameters


Executing Raw Queries with Parameters in TypeORM: A Comprehensive Guide

TypeORM is a powerful ORM (Object Relational Mapper) for Node.js, offering a convenient way to interact with databases. While it excels in handling complex data relationships and abstractions, there are times when raw SQL queries provide greater flexibility or performance. This article explores how to execute raw queries with parameters in TypeORM, ensuring security and efficiency.

The Problem: You need to execute a custom SQL query that requires dynamic data, such as user input or specific values from your application. Directly injecting variables into SQL statements is a major security risk, leaving you vulnerable to SQL injection attacks.

The Solution: TypeORM's built-in queryRunner.query method provides a safe and efficient way to execute raw queries with parameterized inputs.

Scenario: Retrieving Users Based on a Custom Search Criteria

Imagine a scenario where you want to allow users to search for other users based on their name, email, or a combination of both. To achieve this, we'll write a raw SQL query and parameterize it using TypeORM.

import { createConnection, QueryRunner } from 'typeorm';

async function searchUsers(query: string) {
  const connection = await createConnection();
  const queryRunner = connection.createQueryRunner();

  try {
    const users = await queryRunner.query(`
      SELECT * FROM users
      WHERE name LIKE :query OR email LIKE :query
    `, { query: `%${query}%` });

    console.log(users);
  } catch (error) {
    console.error('Error executing query:', error);
  } finally {
    await queryRunner.release();
  }
}

searchUsers('John'); // Searches for users with "John" in their name or email

Explanation:

  • Query Runner: We create a QueryRunner object to manage the database connection and execute the query.
  • Parameterized Query: The query uses :query as a placeholder for the search term, preventing SQL injection vulnerabilities.
  • Parameter Mapping: The query object maps the :query placeholder to the query variable. We use string interpolation to include the "%" wildcards for a LIKE search.
  • Error Handling: The try...catch block ensures proper error handling.
  • Connection Release: The finally block ensures the connection is released after the query is executed.

Benefits of Parameterized Queries:

  • Security: Prevents SQL injection attacks by separating query logic from user input.
  • Flexibility: Allows dynamic query construction based on application data.
  • Performance: Often leads to improved performance compared to string concatenation for query building.

Additional Considerations:

  • Data Validation: Ensure that user input is validated before constructing queries.
  • Query Complexity: For complex queries, consider using TypeORM's createQueryBuilder method, which provides more advanced features and type safety.
  • Transaction Management: For operations involving multiple queries, use transactions to ensure data integrity.

Conclusion:

TypeORM's raw query execution with parameters provides a powerful tool for integrating custom SQL into your applications while maintaining security and efficiency. By understanding the benefits and best practices, you can leverage this feature to extend the capabilities of your TypeORM-based projects.

Further Exploration:

By utilizing TypeORM's features effectively, you can develop robust and secure data management solutions for your applications.