SQL-Tag
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
TypeORM bietet eine Möglichkeit, SQL-Abfragen mit Template-Literals zu schreiben, die automatisch Parameter basierend auf Ihrem Datenbanktyp handhaben. Diese Funktion verhindert SQL-Injection und macht Abfragen gleichzeitig besser lesbar. Der SQL-Tag ist als Wrapper um die .query-Methode implementiert und bietet eine alternative Schnittstelle bei gleicher Kernfunktionalität.
Grundlegende Verwendung
Der sql-Tag ist auf DataSource-, EntityManager-, Repository- und QueryRunner-Instanzen verfügbar:
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
Parameterbehandlung
Parameter werden automatisch maskiert und gemäß Ihrem Datenbanktyp formatiert:
- PostgreSQL, CockroachDB, Aurora PostgreSQL verwenden
$1,$2, usw.:
// 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 verwenden
?:
// Query becomes: SELECT * FROM users WHERE name = ?
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
- Oracle verwendet
:1,:2, usw.:
// Query becomes: SELECT * FROM users WHERE name = :1
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
- MSSQL verwendet
@1,@2, usw.:
// Query becomes: SELECT * FROM users WHERE name = @1
const users = await dataSource.sql`SELECT * FROM users WHERE name = ${"John"}`
Mehrere Parameter
Sie können mehrere Parameter und komplexe Ausdrücke verwenden:
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}
`
Parameterlisten erweitern
Um ein Array in eine dynamische Parameterliste umzuwandeln, wickeln Sie es in eine Funktion. Dies wird häufig für IN (...)-Ausdrücke verwendet, wo jeder Wert als separater Parameter übergeben werden muss:
// Query becomes: SELECT * FROM users WHERE id IN (?, ?, ?)
const users = await dataSource.sql`
SELECT * FROM users
WHERE id IN (${() => [1, 2, 3]})
`
Unmaskierte Ausdrücke einfügen
Wenn Sie einen Ausdruck einfügen möchten, der nicht in einen Parameter umgewandelt werden soll, wickeln Sie die Zeichenkette in eine Funktion. Dies eignet sich für dynamische Spalten-, Tabellen- oder Schemanamen oder bedingte SQL-Klauseln.
Achtung! Roh-SQL wird auf diese Weise nicht maskiert. Verwenden Sie dies nicht mit Werten aus Benutzereingaben.
// Query becomes: SELECT * FROM dynamic_table_name
const rawData = await dataSource.sql`
SELECT * FROM ${() => "dynamic_table_name"}
`
Funktionen
-
Verhinderung von SQL-Injection: Parameter werden korrekt maskiert
-
Datenbankunabhängig: Parameterformatierung erfolgt automatisch basierend auf Ihrem Datenbanktyp
-
Lesbare Abfragen: Template-Literals machen Abfragen lesbarer als Parameter-Arrays
Vergleich mit der Query-Methode
Die herkömmliche query-Methode erfordert manuelle Parameterplatzhalter-Verwaltung:
// 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}`
Der SQL-Tag handhabt die Parameterformatierung automatisch, was Fehlerpotenzial reduziert.