Zum Hauptinhalt springen

Einfügen mit Query Builder

Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Sie können INSERT-Abfragen mit dem QueryBuilder erstellen. Beispiele:

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values([
{ firstName: "Timber", lastName: "Saw" },
{ firstName: "Phantom", lastName: "Lancer" },
])
.execute()

Dies ist in Bezug auf die Leistung die effizienteste Methode, um Zeilen in Ihre Datenbank einzufügen. Auf diese Weise können Sie auch Masseneinfügungen durchführen.

Unterstützung für rohes SQL

In einigen Fällen müssen Sie bei der Ausführung von SQL-Abfragen einen Funktionsstil verwenden:

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values({
firstName: "Timber",
lastName: () => "CONCAT('S', 'A', 'W')",
})
.execute()

Warnung: Stellen Sie bei Verwendung von rohem SQL sicher, dass Werte ordnungsgemäß bereinigt werden, um SQL-Injection zu verhindern.

Werte bei Konflikt aktualisieren (ON CONFLICT)

Wenn einzufügende Werte aufgrund vorhandener Daten in Konflikt geraten, kann die orUpdate-Funktion verwendet werden, um bestimmte Werte im Konfliktziel zu aktualisieren.

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values({
firstName: "Timber",
lastName: "Saw",
externalId: "abc123",
})
.orUpdate(["firstName", "lastName"], ["externalId"])
.execute()

Werte bei Konflikt mit Bedingung aktualisieren (Postgres, Oracle, MSSQL, SAP HANA)

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values({
firstName: "Timber",
lastName: "Saw",
externalId: "abc123",
})
.orUpdate(["firstName", "lastName"], ["externalId"], {
overwriteCondition: {
where: {
firstName: Equal("Phantom"),
},
},
})
.execute()

Fehler ignorieren (IGNORE) (MySQL) oder Nichts tun (DO NOTHING) (Postgres, Oracle, MSSQL, SAP HANA) beim Einfügen

Wenn einzufügende Werte aufgrund vorhandener Daten oder ungültiger Inhalte in Konflikt geraten, kann die orIgnore-Funktion verwendet werden, um Fehler zu unterdrücken und nur Zeilen mit gültigen Daten einzufügen.

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values({
firstName: "Timber",
lastName: "Saw",
externalId: "abc123",
})
.orIgnore()
.execute()

Datenaktualisierung überspringen bei unveränderten Werten (Postgres, Oracle, MSSQL, SAP HANA)

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values({
firstName: "Timber",
lastName: "Saw",
externalId: "abc123",
})
.orUpdate(["firstName", "lastName"], ["externalId"], {
skipUpdateIfNoValuesChanged: true,
})
.execute()

Teilweisen Index verwenden (Postgres)

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values({
firstName: "Timber",
lastName: "Saw",
externalId: "abc123",
})
.orUpdate(["firstName", "lastName"], ["externalId"], {
skipUpdateIfNoValuesChanged: true,
indexPredicate: "date > 2020-01-01",
})
.execute()

Einfügen mit SELECT-Abfrage

Du kannst Daten aus einer Tabelle in eine andere einfügen, indem du eine SELECT-Abfrage mit der Methode valuesFromSelect() verwendest. Dadurch wird eine INSERT INTO ... SELECT FROM-Anweisung erzeugt, die für Datenmigration, Archivierung oder das Kopieren von Daten zwischen Tabellen nützlich ist.

Direkte Verwendung eines SelectQueryBuilder

// Create a select query to get the source data
const selectQuery = dataSource
.createQueryBuilder()
.select(["user.firstName", "user.lastName"])
.from(User, "user")
.where("user.isActive = :isActive", { isActive: true })

// Insert the selected data into another table
await dataSource
.createQueryBuilder()
.insert()
.into(ArchivedUser, ["firstName", "lastName"])
.valuesFromSelect(selectQuery)
.execute()

Verwendung einer Callback-Funktion

Du kannst auch eine Callback-Funktion verwenden, um die SELECT-Abfrage zu erstellen:

await dataSource
.createQueryBuilder()
.insert()
.into(ArchivedUser, ["firstName", "lastName", "archivedAt"])
.valuesFromSelect((qb) =>
qb
.select(["user.firstName", "user.lastName", "NOW()"])
.from(User, "user")
.where("user.deletedAt IS NOT NULL"),
)
.execute()

Mit Joins

Du kannst Joins in der SELECT-Abfrage verwenden, um Daten aus mehreren Tabellen zu kombinieren:

await dataSource
.createQueryBuilder()
.insert()
.into(UserReport, ["userName", "orderCount"])
.valuesFromSelect((qb) =>
qb
.select(["user.name", "COUNT(order.id)"])
.from(User, "user")
.leftJoin("user.orders", "order")
.groupBy("user.id"),
)
.execute()

Hinweis: Bei Verwendung von valuesFromSelect() werden Entity-Listener und Subscriber (@BeforeInsert, @AfterInsert) nicht aufgerufen, da während des Einfügevorgangs keine Entity-Instanzen erstellt werden.

Hinweis: Die Option updateEntity hat bei valuesFromSelect() keine Wirkung, da es keine Entity-Instanzen zum Aktualisieren gibt.