Drizzle 查询 +增删改查

This guide assumes familiarity with:

Drizzle 为你提供了几种查询数据库的方法,你可以自行决定在下一个项目中需要哪种方法。它可以是类似 SQL 的语法,也可以是关系语法。让我们检查一下:

为什么像 SQL 那样?

如果你懂 SQL,你就懂 Drizzle。

其他 ORM 和数据框架往往会偏离或抽象 SQL,导致双重学习曲线:你需要学习 SQL 和框架的 API。

Drizzle 则相反。我们拥抱 SQL,并将 Drizzle 的核心构建为类 SQL,因此你几乎无需学习即可充分利用 SQL 的强大功能。

// Access your data
await db
  .select()
	.from(posts)
	.leftJoin(comments, eq(posts.id, comments.post_id))
	.where(eq(posts.id, 10))
SELECT * 
FROM posts
LEFT JOIN comments ON posts.id = comments.post_id
WHERE posts.id = 10

使用类似 SQL 的语法,你可以复制许多使用纯 SQL 可以执行的操作,并且确切地知道 Drizzle 将执行哪些操作以及将生成哪些查询。你可以执行各种查询,包括 select、insert、update、delete,以及使用别名、WITH 子句、子查询、准备好的语句等。让我们看更多示例。

insert
update
delete
await db.insert(users).values({ email: 'user@gmail.com' })
INSERT INTO users (email) VALUES ('user@gmail.com')

为什么不像 SQL 那样?

我们始终致力于提供完美平衡的解决方案。虽然类似 SQL 的查询可以满足你的 100% 需求,但在某些常见场景下,数据查询可以更高效。

我们构建了查询 API,以便你能够以最便捷、最高效的方式从数据库中获取关系型嵌套数据,而无需担心连接或数据映射。

Drizzle 始终只输出 1 个 SQL 查询。你可以放心地将其与无服务器数据库一起使用,无需担心性能或往返成本!

const result = await db.query.users.findMany({
	with: {
		posts: true
	},
});

高级

使用 Drizzle,你可以按照任何你想要的方式组合和分区查询。你可以独立于主查询编写过滤器、单独的子查询或条件语句等等。让我们看几个高级示例:

编写 WHERE 语句然后在查询中使用它

async function getProductsBy({
  name,
  category,
  maxPrice,
}: {
  name?: string;
  category?: string;
  maxPrice?: string;
}) {
  const filters: SQL[] = [];

  if (name) filters.push(ilike(products.name, name));
  if (category) filters.push(eq(products.category, category));
  if (maxPrice) filters.push(lte(products.price, maxPrice));

  return db
    .select()
    .from(products)
    .where(and(...filters));
}

将子查询拆分成不同的变量,然后在主查询中使用它们

const subquery = db
	.select()
	.from(internalStaff)
	.leftJoin(customUser, eq(internalStaff.userId, customUser.id))
	.as('internal_staff');

const mainQuery = await db
	.select()
	.from(ticket)
	.leftJoin(subquery, eq(subquery.internal_staff.userId, ticket.staffId));

下一步是什么?