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

How to Format SQL queries in TypeScript

How to Format SQL Queries in TypeScript

Formatting SQL queries in TypeScript is crucial for maintaining readable, efficient, and secure database interactions. Properly formatted queries can improve code readability, reduce errors, and even enhance performance. In this guide, we will explore how to format SQL queries in TypeScript, covering a quick example, step-by-step breakdown, edge cases, common mistakes, performance tips, and frequently asked questions.

Quick Example

To get started, here's a minimal example of formatting a SQL query in TypeScript:

import { sql } from 'sql-template-tag';

const query = sql`
  SELECT *
  FROM users
  WHERE name = ${'John Doe'}
  AND age > ${25};
`;

console.log(query);

This example uses the sql-template-tag library to format a simple SQL query. The sql function takes a template literal as an argument, allowing you to embed values into the query using the ${} syntax.

Step-by-Step Breakdown

Let's walk through the code line by line:

  1. import { sql } from 'sql-template-tag';:
    • We import the sql function from the sql-template-tag library, which we'll use to format our SQL query.
    • You can install this library using npm by running npm install sql-template-tag.
  2. const query = sql``;:
    • We define a constant query and assign it the result of calling the sql function with a template literal.
    • The template literal is a multiline string that contains our SQL query.
  3. SELECT * FROM users WHERE name = ${'John Doe'} AND age > ${25};:
    • Inside the template literal, we define our SQL query.
    • We use the ${} syntax to embed values into the query. In this case, we're embedding the strings 'John Doe' and 25 as values for the name and age columns, respectively.

Handling Edge Cases

Here are some common edge cases to consider when formatting SQL queries in TypeScript:

Empty/Null Input

const name = null;
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${name};
`;

console.log(query); // outputs: "SELECT * FROM users WHERE name = NULL;"

In this case, the sql function will correctly handle the null value and output a valid SQL query.

Invalid Input

const name = 'Robert'); DROP TABLE users; --';
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${name};
`;

console.log(query); // outputs: "SELECT * FROM users WHERE name = 'Robert''); DROP TABLE users; --';"

This example demonstrates how the sql function will not prevent SQL injection attacks. You should always validate and sanitize user input before embedding it into a query.

Large Input

const largeInput = 'a'.repeat(10000);
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${largeInput};
`;

console.log(query); // outputs: "SELECT * FROM users WHERE name = '...';"

In this case, the sql function will truncate the input value to prevent extremely large queries.

Unicode/Special Characters

const name = 'Jöhn Döe';
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${name};
`;

console.log(query); // outputs: "SELECT * FROM users WHERE name = 'Jöhn Döe';"

The sql function will correctly handle Unicode characters and special characters in the input values.

Common Mistakes

Here are three common mistakes developers make when formatting SQL queries in TypeScript:

Mistake 1: Not using template literals

const name = 'John Doe';
const query = 'SELECT * FROM users WHERE name = ' + name;
console.log(query); // outputs: "SELECT * FROM users WHERE name = John Doe"

This code is vulnerable to SQL injection attacks and will not produce a valid SQL query.

Corrected code:

const name = 'John Doe';
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${name};
`;

Mistake 2: Not validating user input

const userInput = 'Robert'); DROP TABLE users; --';
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${userInput};
`;

This code is vulnerable to SQL injection attacks.

Corrected code:

const userInput = 'Robert'); DROP TABLE users; --';
if (userInput.includes(';')) {
  throw new Error('Invalid input');
}
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${userInput};
`;

Mistake 3: Not handling null values

const name = null;
const query = sql`
  SELECT *
  FROM users
  WHERE name = '${name}';
`;

This code will produce a syntax error.

Corrected code:

const name = null;
const query = sql`
  SELECT *
  FROM users
  WHERE name = ${name};
`;

Performance Tips

Here are three performance tips for formatting SQL queries in TypeScript:

  1. Use prepared statements: Prepared statements can improve performance by reducing the overhead of parsing and compiling SQL queries.
  2. Use parameterized queries: Parameterized queries can improve performance by reducing the overhead of escaping and quoting input values.
  3. Use a connection pool: A connection pool can improve performance by reducing the overhead of establishing and closing database connections.

FAQ

Q: What is the difference between sql-template-tag and other SQL formatting libraries?

A: sql-template-tag is a lightweight library that provides a simple and efficient way to format SQL queries in TypeScript. Other libraries may offer additional features, but may also introduce additional overhead.

Q: How do I handle SQL injection attacks?

A: Always validate and sanitize user input before embedding it into a query. Use prepared statements and parameterized queries to reduce the risk of SQL injection attacks.

Q: Can I use sql-template-tag with other databases?

A: Yes, sql-template-tag supports multiple databases, including MySQL, PostgreSQL, and SQLite.

Q: How do I optimize the performance of my SQL queries?

A: Use prepared statements, parameterized queries, and a connection pool to improve the performance of your SQL queries.

Q: Can I use sql-template-tag with TypeScript 3.x?

A: Yes, sql-template-tag is compatible with TypeScript 3.x and later versions.

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