Insertar usando Query Builder
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
updateEntityno tiene efecto convaluesFromSelect()ya que no existen instancias de entidad para actualizar.