跳转到主要内容

使用 QueryBuilder 进行插入操作

您可以使用 QueryBuilder 创建 INSERT 查询。示例:

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

这是性能上最高效的方式,可以向数据库插入行。您也可以使用此方法执行批量插入。

原始 SQL 支持

在某些情况下,当您需要执行 SQL 查询时,您需要使用函数形式的值:

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

此语法不会转义您的值,您需要自行处理转义。

在冲突时更新值(ON CONFLICT)

如果要插入的值与现有数据冲突,可以使用 orUpdate 函数来更新冲突目标上的特定值。

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

如果值未更改,则跳过数据更新(Postgres)

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

使用部分索引(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()