Vai al contenuto principale

Inserimento tramite Query Builder

Traduzione Beta Non Ufficiale

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

È possibile creare query INSERT utilizzando QueryBuilder. Esempi:

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

Questo è il metodo più efficiente in termini di prestazioni per inserire righe nel database. Consente inoltre di eseguire inserimenti in blocco.

Supporto per SQL grezzo

In alcuni casi, quando devi eseguire query SQL, è necessario utilizzare valori in stile funzione:

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

Attenzione: Quando utilizzi SQL grezzo, assicurati di sanificare correttamente i valori per prevenire SQL injection.

Aggiornare valori in caso di conflitto (ON CONFLICT)

Se i valori che si tentano di inserire entrano in conflitto con dati esistenti, la funzione orUpdate permette di aggiornare valori specifici sul target in conflitto.

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

Aggiornare valori ON CONFLICT con condizione (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()

Ignorare errori (MySQL) o non fare nulla (DO NOTHING) (Postgres, Oracle, MSSQL, SAP HANA) durante l'inserimento

Se i valori da inserire entrano in conflitto con dati esistenti o contengono dati non validi, la funzione orIgnore sopprime gli errori e inserisce solo le righe con dati validi.

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

Saltare aggiornamento dati se valori invariati (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()

Utilizzare indici parziali (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()

Inserimento da Select

Puoi inserire dati da una tabella in un'altra utilizzando una query SELECT con il metodo valuesFromSelect(). Questo crea un'istruzione INSERT INTO ... SELECT FROM, utile per la migrazione dei dati, l'archiviazione o la copia di dati tra tabelle.

Utilizzando direttamente un 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()

Utilizzando una funzione di callback

Puoi anche utilizzare una funzione di callback per costruire la query di selezione:

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()

Con join

Puoi utilizzare join nella query di selezione per combinare dati da più tabelle:

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()

Nota: Quando si utilizza valuesFromSelect(), gli ascoltatori e i sottoscrittori delle entità (@BeforeInsert, @AfterInsert) non vengono chiamati perché non vengono create istanze di entità durante l'operazione di inserimento.

Nota: L'opzione updateEntity non ha effetto con valuesFromSelect() poiché non ci sono istanze di entità da aggiornare.