Vai al contenuto principale

Tag SQL

Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

TypeORM offre un modo per scrivere query SQL utilizzando template literal con gestione automatica dei parametri in base al tipo di database. Questa funzionalità aiuta a prevenire l'SQL injection rendendo allo stesso tempo le query più leggibili. Il tag SQL è implementato come wrapper attorno al metodo .query, fornendo un'interfaccia alternativa pur mantenendo la stessa funzionalità sottostante.

Utilizzo Base

Il tag sql è disponibile sulle istanze di DataSource, EntityManager, Repository e QueryRunner:

const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`

Gestione dei Parametri

I parametri vengono automaticamente escapati e formattati secondo il tipo di database:

  • PostgreSQL, CockroachDB, Aurora PostgreSQL utilizzano $1, $2, ecc.:
// Query becomes: SELECT * FROM users WHERE name = $1
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
  • MySQL, MariaDB, Aurora MySQL, SAP, SQLite utilizzano ?:
// Query becomes: SELECT * FROM users WHERE name = ?
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
  • Oracle utilizza :1, :2, ecc.:
// Query becomes: SELECT * FROM users WHERE name = :1
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
  • MSSQL utilizza @1, @2, ecc.:
// Query becomes: SELECT * FROM users WHERE name = @1
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`

Parametri Multipli

Puoi utilizzare più parametri ed espressioni complesse:

const name = "John"
const age = 30
const active = true
const users = await dataSource.sql`
SELECT * FROM users
WHERE name LIKE ${name + "%"}
AND age > ${age}
AND is_active = ${active}
`

Espansione di Liste di Parametri

Per trasformare un array di valori in una lista dinamica di parametri in un'espressione template, racchiudi l'array in una funzione. Questo è comunemente usato per scrivere un'espressione IN (...) in SQL, dove ogni valore nella lista deve essere fornito come parametro separato:

// Query becomes: SELECT * FROM users WHERE id IN (?, ?, ?)
const users = await dataSource.sql`
SELECT * FROM users
WHERE id IN (${() => [1, 2, 3]})
`

Interpolazione di Espressioni Non Escapate

Quando vuoi inserire un'espressione template che non deve essere trasformata in un parametro di database, racchiudi la stringa in una funzione. Questo può essere usato per definire dinamicamente nomi di colonne, tabelle o schemi che non possono essere parametrizzati, o per impostare clausole condizionali nel SQL.

Attenzione! Nessun escaping viene eseguito sul SQL grezzo inserito in questo modo. Non è sicuro utilizzarlo con valori provenienti da input utente.

// Query becomes: SELECT * FROM dynamic_table_name
const rawData = await dataSource.sql`
SELECT * FROM ${() => "dynamic_table_name"}
`

Caratteristiche

  • Prevenzione SQL Injection: I parametri vengono escapati correttamente

  • Agnostico rispetto al Database: La formattazione dei parametri viene gestita in base al tipo di database

  • Query Leggibili: I template literal rendono le query più leggibili rispetto agli array di parametri

Confronto con il Metodo Query

Il tradizionale metodo query richiede la gestione manuale dei segnaposto dei parametri:

// Traditional query method
await dataSource.query("SELECT * FROM users WHERE name = $1 AND age > $2", [
"John",
30,
])

// SQL tag alternative
await dataSource.sql`SELECT * FROM users WHERE name = ${"John"} AND age > ${30}`

Il tag SQL gestisce automaticamente la formattazione dei parametri, riducendo potenziali errori.