Drizzle 查询 + CRUD
Drizzle 为你提供了几种查询数据库的方式,具体该选择哪一种取决于你下一个项目的需求。 它可以是类 SQL 语法,也可以是关系型语法。让我们来看看:
为什么像 SQL?
如果你懂 SQL,你就懂 Drizzle。
其他 ORM 和数据框架往往会偏离 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(like(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));