Sometimes you need to write your own database commands directly to do things that tools can't do easily.
Raw queries when needed in Express
const result = await db.raw('YOUR SQL QUERY HERE', [optionalParams]);
Use db.raw() to run raw SQL queries in Express with a database library like Knex.
You can pass parameters safely to avoid SQL injection by using placeholders and an array of values.
const users = await db.raw('SELECT * FROM users WHERE age > ?', [18]);
const count = await db.raw('SELECT COUNT(*) FROM orders');
const result = await db.raw('UPDATE products SET price = price * 1.1 WHERE category = ?', ['books']);
This Express app uses a raw SQL query to get users aged 18 or older from an in-memory SQLite database and returns them as JSON.
import express from 'express'; import knex from 'knex'; const app = express(); const db = knex({ client: 'sqlite3', connection: { filename: ':memory:' }, useNullAsDefault: true }); // Setup a simple table and data await db.schema.createTable('users', table => { table.increments('id'); table.string('name'); table.integer('age'); }); await db('users').insert([ { name: 'Alice', age: 25 }, { name: 'Bob', age: 17 }, { name: 'Charlie', age: 30 } ]); app.get('/adults', async (req, res) => { const adultsResult = await db.raw('SELECT name, age FROM users WHERE age >= ?', [18]); const adults = adultsResult.rows || adultsResult; // Adjust for different DB clients res.json(adults); }); app.listen(3000, () => { console.log('Server running on http://localhost:3000'); });
Always use parameter placeholders (?) and pass values as an array to avoid SQL injection risks.
Raw queries bypass some safety and convenience features, so use them only when necessary.
Check your database library's documentation for exact syntax and return formats of raw queries.
Raw queries let you write direct SQL commands when needed.
Use placeholders and parameters to keep queries safe.
Good for special cases where normal query builders can't help.
Practice
Solution
Step 1: Understand raw queries purpose
Raw queries allow writing direct SQL commands for complex or special cases.Step 2: Compare with other options
Options A, B, and C are incorrect because raw queries do not skip database calls, auto-generate SQL, or avoid SQL.Final Answer:
To write direct SQL commands when query builders are insufficient -> Option AQuick Check:
Raw queries = direct SQL use [OK]
- Thinking raw queries auto-generate SQL
- Believing raw queries avoid SQL entirely
- Assuming raw queries skip database calls
Solution
Step 1: Identify parameterized query syntax
Using '?' with an array of parameters is the standard safe way to pass values.Step 2: Check other options
db.query('SELECT * FROM users WHERE id = ' + userId) concatenates strings (unsafe). Options C and D use placeholders not standard in many Express SQL libraries.Final Answer:
db.query('SELECT * FROM users WHERE id = ?', [userId]) -> Option BQuick Check:
Use '?' + params array for safe raw queries [OK]
- Concatenating variables directly into query strings
- Using unsupported placeholder syntax
- Not passing parameters as an array
const result = await db.query('SELECT * FROM products WHERE price > ?', [100]);
console.log(result.rows.length);What will be logged if there are 5 products priced over 100?
Solution
Step 1: Understand the query and parameters
The raw query selects products with price greater than 100, passing 100 safely as a parameter.Step 2: Interpret the result object
Assuming the database library returns an object with a 'rows' array, its length will be the number of matching products, which is 5.Final Answer:
5 -> Option AQuick Check:
Rows length = number of matching products [OK]
- Expecting result directly as array without .rows
- Confusing parameter placement
- Assuming query returns undefined or error
const userId = 10;
const result = await db.query('SELECT * FROM users WHERE id = ' + userId);Solution
Step 1: Analyze query construction
The query concatenates userId directly into the string, which is unsafe and can cause SQL injection.Step 2: Understand best practice
Parameters should be passed separately using placeholders to avoid injection risks.Final Answer:
It risks SQL injection by concatenating variables directly -> Option CQuick Check:
Never concatenate variables directly in raw queries [OK]
- Ignoring SQL injection risks
- Thinking concatenation is safe for numbers
- Not using parameterized queries
Solution
Step 1: Consider safety and flexibility
Using a loop with parameterized queries ensures each update is safe and avoids SQL injection.Step 2: Evaluate other options
Concatenating all updates risks injection and syntax errors; skipping parameters is unsafe; direct concatenation is insecure.Final Answer:
Use a loop with parameterized raw queries for each user update -> Option DQuick Check:
Loop + parameters = safe batch updates [OK]
- Trying to build one big concatenated query
- Ignoring parameterization for speed
- Concatenating user data directly
Ready to prove it?
Pass the test and this pattern moves unknown
