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