Saltar al contenido principal

Insertar usando Query Builder

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Puedes crear consultas INSERT usando QueryBuilder. Ejemplos:

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

Esta es la forma más eficiente en términos de rendimiento para insertar filas en tu base de datos. También puedes realizar inserciones masivas de esta manera.

Soporte para SQL crudo

En algunos casos cuando necesitas ejecutar consultas SQL, debes usar valores con sintaxis de función:

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

Advertencia: Al usar SQL crudo, asegúrate de sanear adecuadamente los valores para prevenir inyecciones SQL.

Actualizar valores ON CONFLICT

Si los valores que intentas insertar entran en conflicto con datos existentes, la función orUpdate puede usarse para actualizar valores específicos en el objetivo conflictivo.

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

Actualizar valores ON CONFLICT con condición (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()

IGNORE error (MySQL) o DO NOTHING (Postgres, Oracle, MSSQL, SAP HANA) durante la inserción

Si los valores que intentas insertar entran en conflicto con datos existentes o contienen información inválida, la función orIgnore puede suprimir errores e insertar solo filas con datos válidos.

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

Omitir actualización de datos si los valores no cambiaron (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()

Usar índice parcial (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()

Insertar desde una selección

Puedes insertar datos de una tabla a otra usando una consulta SELECT con el método valuesFromSelect(). Esto crea una sentencia INSERT INTO ... SELECT FROM, útil para migración de datos, archivado o copia de información entre tablas.

Usar un SelectQueryBuilder directamente

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

Usar una función callback

También puedes usar una función callback para construir la consulta de selección:

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 joins

Puedes usar joins en la consulta de selección para combinar datos de múltiples tablas:

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: Al usar valuesFromSelect(), los listeners de entidad y suscriptores (@BeforeInsert, @AfterInsert) no se ejecutan porque no se crean instancias de entidad durante la operación de inserción.

Nota: La opción updateEntity no tiene efecto con valuesFromSelect() ya que no existen instancias de entidad para actualizar.