Drizzle 查询 +增删改查
This guide assumes familiarity with:
-
如何定义你的架构 - Schema 基础知识
-
如何连接数据库 - 连接基础知识
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));
下一步是什么?
Zero to Hero