Drizzle 查询 + CRUD

本指南假定您熟悉

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 子句、子查询、预处理语句等。让我们看更多示例

插入
更新
删除
await db.insert(users).values({ email: '[email protected]' })
INSERT INTO users (email) VALUES ('[email protected]')

为何不选择 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?: 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));

接下来是什么?