Zum Hauptinhalt springen

SQL-Tag

Inoffizielle Beta-Übersetzung

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.