Drizzle 查询 + CRUD

本指南假定您已熟悉:

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

为什么是类 SQL?


如果你会 SQL,你就会 Drizzle。

其他 ORM 和数据框架往往会偏离 SQL,或者对 SQL 进行抽象,导致需要双重学习:你既要学习 SQL,也要学习框架的 API。

Drizzle 则相反。 我们拥抱 SQL,并从核心上将 Drizzle 构建为类 SQL 的形式,因此你几乎不需要学习成本,同时又能完全使用 SQL 的强大能力。

// 访问你的数据
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% 的需求,
但在某些常见场景下,使用更高效的方式查询数据会更加合适。

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

Drizzle 始终只输出一条 SQL 查询。你可以放心地将它用于无服务器数据库,
再也不用担心性能或往返开销!

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

高级

使用 Drizzle,查询可以按你想要的任何方式进行组合和分段。你可以将过滤条件独立于主查询进行组合,分离子查询或条件语句,等等。让我们看几个高级示例:

组合一个 WHERE 语句,然后在查询中使用它

async function getProductsBy({
  name,
  category,
  maxPrice,
}: {
  name?: string;
  category?: string;
  maxPrice?: number;
}) {
  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));

接下来是什么?