传递给 .set() 的所有值都会自动参数化。
例如,这个查询:
await db.update(users).set({ name: "Mr. Dan" }).where(eq(users.name, "Dan"));将被翻译为:
update "users" set "name" = ? where "users"."name" = ?; -- params: ['Mr. Dan', 'Dan']传递给 .set() 的所有值都会自动参数化。
例如,这个查询:
await db.update(users).set({ name: "Mr. Dan" }).where(eq(users.name, "Dan"));将被翻译为:
update "users" set "name" = ? where "users"."name" = ?; -- params: ['Mr. Dan', 'Dan']你传递给 update 的对象应当包含与数据库模式中的列名匹配的键。
对象中的 undefined 值会被忽略:要将某一列设为 null,请传入 null。
await db.update(users)
.set({ name: 'Mr. Dan' })
.where(eq(users.name, 'Dan'));await db.update(users)
.set({ name: null })
.where(eq(users.name, 'Dan'));你可以将 SQL 作为值传入更新对象,例如:
await db.update(users)
.set({ updatedAt: sql`NOW()` })
.where(eq(users.name, 'Dan'));使用 .limit() 为查询添加 limit 子句——例如:
await db.update(usersTable).set({ verified: true }).limit(2);update "users" set "verified" = ? limit ?;使用 .orderBy() 为查询添加 order by 子句,按指定字段对结果进行排序:
import { asc, desc } from 'drizzle-orm';
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name);
await db.update(usersTable).set({ verified: true }).orderBy(desc(usersTable.name));
// 按多个字段排序
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name, usersTable.name2);
await db.update(usersTable).set({ verified: true }).orderBy(asc(usersTable.name), desc(usersTable.name2));update "users" set "verified" = ? order by "name";
update "users" set "verified" = ? order by "name" desc;
update "users" set "verified" = ? order by "name", "name2";
update "users" set "verified" = ? order by "name" asc, "name2" desc;你可以在 SQLite 中更新一行并将其取回:
const updatedUserId = await db.update(users).set({ name: "Mr. Dan" }).where(eq(users.name, "Dan")).returning({ updatedId: users.id });
// ^ { updatedId: number | null }[]update "users" set "name" = 'Mr. Dan' where "users"."name" = 'Dan' returning "id";with update 子句使用 with 子句可以通过将复杂查询拆分为更小的子查询(称为公共表表达式,CTE)来帮助你简化查询:
const averagePrice = db.$with('average_price').as(
db.select({ value: sql`avg(${products.price})`.as('value') }).from(products)
);
const result = await db.with(averagePrice)
.update(products)
.set({
cheap: true
})
.where(lt(products.price, sql`(select * from ${averagePrice})`))
.returning({
id: products.id
});with "average_price" as (select avg("price") as "value" from "products")
update "products" set "cheap" = true
where "products"."price" < (select * from "average_price")
returning "id"正如 SQLite 文档所述:
UPDATE-FROM 的想法是对 SQL 的一种扩展,它允许由数据库中的其他表来驱动 UPDATE 语句。
“目标”表是正在被更新的特定表。使用 UPDATE-FROM,你可以将目标表与数据库中的其他表进行连接,以帮助计算哪些行需要更新,以及这些行的新值应该是什么
await db
.update(users)
.set({ cityId: cities.id })
.from(cities)
.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))update "users" set "city_id" = "cities"."id"
from "cities"
where (("cities"."name" = 'Seattle') and ("users"."name" = 'John'))你也可以为连接的表起别名(更新的表也可以起别名)。
const c = alias(cities, 'c');
await db
.update(users)
.set({ cityId: c.id })
.from(c);update "users" set "city_id" = "c"."id"
from "cities" "c"在 SQLite 中,你还可以返回来自已连接表的列。
const updatedUsers = await db
.update(users)
.set({ cityId: cities.id })
.from(cities)
.returning({ id: users.id, cityName: cities.name });update "users" set "city_id" = "cities"."id"
from "cities"
returning "users"."id", "cities"."name"