Try it yourself with our free Sql Formatter tool — runs entirely in your browser, no signup needed.

How to Format SQL queries in Node.js

How to Format SQL Queries in Node.js

When working with databases in Node.js, formatting SQL queries is crucial for maintaining readability, preventing SQL injection attacks, and ensuring performance. In this guide, we'll explore how to format SQL queries in Node.js using best practices and practical examples.

Quick Example

Here's a minimal example of formatting a SQL query in Node.js using the mysql package:

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'username',
  password: 'password',
  database: 'database'
});

const query = {
  sql: 'SELECT * FROM users WHERE name = ?',
  values: ['John Doe']
};

connection.query(query, (error, results) => {
  if (error) {
    console.error(error);
  } else {
    console.log(results);
  }
});

This example uses a parameterized query to prevent SQL injection attacks.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • const mysql = require('mysql');: We import the mysql package, which is a popular MySQL driver for Node.js. You can install it using npm install mysql.
  • const connection = mysql.createConnection({...}): We create a connection to the database using the createConnection method. We pass an options object with the host, user, password, and database.
  • const query = {...}: We define a query object with two properties: sql and values. The sql property contains the SQL query with a placeholder for the value, and the values property contains an array of values to replace the placeholder.
  • connection.query(query, (error, results) => {...}): We execute the query using the query method, passing the query object and a callback function. The callback function handles the error and results.

Handling Edge Cases

Here are some common edge cases to consider:

Empty/Null Input

When handling empty or null input, we can add a simple check to ensure the query is not executed:

if (!query.values || query.values.length === 0) {
  console.error('Invalid input: empty values');
  return;
}

Invalid Input

To handle invalid input, we can use a try-catch block to catch any errors that occur during query execution:

try {
  connection.query(query, (error, results) => {
    // ...
  });
} catch (error) {
  console.error('Invalid input:', error);
}

Large Input

When dealing with large input, we can use a technique called "pagination" to limit the number of results returned:

const query = {
  sql: 'SELECT * FROM users WHERE name = ? LIMIT 100',
  values: ['John Doe']
};

Unicode/Special Characters

To handle Unicode and special characters, we can use a library like mysql-escape to escape any special characters in the input:

const escape = require('mysql-escape');

const query = {
  sql: 'SELECT * FROM users WHERE name = ?',
  values: [escape('John Doe')]
};

Common Mistakes

Here are some common mistakes developers make when formatting SQL queries in Node.js:

Mistake 1: Not using parameterized queries

WRONG:

const query = 'SELECT * FROM users WHERE name = "' + req.query.name + '"';

RIGHT:

const query = {
  sql: 'SELECT * FROM users WHERE name = ?',
  values: [req.query.name]
};

Mistake 2: Not handling errors

WRONG:

connection.query(query, (results) => {
  console.log(results);
});

RIGHT:

connection.query(query, (error, results) => {
  if (error) {
    console.error(error);
  } else {
    console.log(results);
  }
});

Mistake 3: Not using prepared statements

WRONG:

const query = 'SELECT * FROM users WHERE name = ?';
connection.query(query, ['John Doe'], (results) => {
  console.log(results);
});

RIGHT:

const query = {
  sql: 'SELECT * FROM users WHERE name = ?',
  values: ['John Doe']
};
connection.query(query, (error, results) => {
  // ...
});

Performance Tips

Here are some performance tips for formatting SQL queries in Node.js:

Tip 1: Use prepared statements

Prepared statements can improve performance by reducing the number of queries executed.

const query = {
  sql: 'SELECT * FROM users WHERE name = ?',
  values: ['John Doe']
};
connection.query(query, (error, results) => {
  // ...
});

Tip 2: Use connection pooling

Connection pooling can improve performance by reducing the number of connections created.

const pool = mysql.createPool({
  host: 'localhost',
  user: 'username',
  password: 'password',
  database: 'database'
});

Tip 3: Optimize queries

Optimize queries by reducing the number of joins, subqueries, and sorting.

const query = {
  sql: 'SELECT * FROM users WHERE name = ? LIMIT 100',
  values: ['John Doe']
};

FAQ

Q: What is the best way to handle errors in SQL queries?

A: Use a try-catch block to catch any errors that occur during query execution.

Q: How can I improve the performance of my SQL queries?

A: Use prepared statements, connection pooling, and optimize queries.

Q: What is the difference between a parameterized query and a prepared statement?

A: A parameterized query is a query with placeholders for values, while a prepared statement is a pre-compiled query that can be executed multiple times.

Q: How can I handle Unicode and special characters in SQL queries?

A: Use a library like mysql-escape to escape any special characters in the input.

Q: What is the best way to handle large input in SQL queries?

A: Use pagination to limit the number of results returned.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp