跳至主要内容

Sequelize

此页面比较了 Prisma ORM 和 Sequelize API。

Sequelize vs Prisma ORM

虽然 Prisma ORM 和 Sequelize 解决类似的问题,但它们以截然不同的方式工作。

Sequelize 是一种传统的 ORM,它将映射到模型类。然后,模型类的实例在运行时为应用程序提供 CRUD 查询的接口。

Prisma ORM 是一种新型的 ORM,它可以缓解传统 ORM 的许多问题,例如臃肿的模型实例、将业务逻辑与存储逻辑混合、缺乏类型安全或由延迟加载引起的不可预测的查询等。

它使用 Prisma schema 以声明方式定义应用程序模型。然后,Prisma Migrate 允许从 Prisma schema 生成 SQL 迁移并将其执行到数据库。CRUD 查询由 Prisma Client 提供,Prisma Client 是一款轻量级且完全类型安全的数据库客户端,适用于 Node.js 和 TypeScript。

API 比较

获取单个对象

Prisma ORM

const user = await prisma.user.findUnique({
where: {
id: 1,
},
})

Sequelize

const user = await User.findByPk(id)

获取单个对象的选定标量

Prisma ORM

const user = await prisma.user.findUnique({
where: {
id: 1,
},
select: {
name: true,
},
})

Sequelize

const user = await User.findByPk(1, { attributes: ['name'], raw: true })
提示

使用 raw: true 查询选项返回纯 JavaScript 对象。

获取关系

Prisma ORM

const posts = await prisma.user.findUnique({
where: {
id: 2,
},
include: {
post: true,
},
})

注意select 返回包含 post 数组的 user 对象,而流畅 API 只返回 post 数组。

Sequelize

const user = await User.findByPk(id, {
include: [
{
model: Post,
},
],
})
提示

如果您使用别名来定义 UserPost 之间的关系,请使用 model: Post as "Post" - 例如:User.hasMany(Post, { as: "Post", foreignKey: "authorId" });

过滤具体值

Prisma ORM

const posts = await prisma.post.findMany({
where: {
title: {
contains: 'Hello',
},
},
})

Sequelize

const post = await Post.findAll({
raw: true,
where: {
title: {
[Op.like]: '%Hello%',
},
},
})

其他过滤条件

Prisma ORM

Prisma ORM 生成许多 额外的过滤器,这些过滤器在现代应用程序开发中经常使用。

Sequelize

Sequelize 拥有一个 广泛的运算符集

关系过滤器

Prisma ORM

Prisma ORM 允许您根据一个条件过滤列表,该条件不仅适用于要检索的列表的模型,还适用于该模型的关系

例如,以下查询返回标题中包含 "Hello" 的一个或多个帖子的用户

const posts = await prisma.user.findMany({
where: {
Post: {
some: {
title: {
contains: 'Hello',
},
},
},
},
})

Sequelize

Sequelize 不提供用于关系过滤的专用 API。您可以通过将原始 SQL 查询发送到数据库来获得类似的功能。

分页

Prisma ORM

游标式分页

const page = await prisma.post.findMany({
before: {
id: 242,
},
last: 20,
})

偏移分页

const cc = await prisma.post.findMany({
skip: 200,
first: 20,
})

Sequelize

游标分页

const posts = await Post.findAll({
limit: 20,
where: {
id: {
[Op.gt]: 242,
},
},
})

注意:Sequelize 使用 Sequelize 运算符 执行游标分页。

偏移分页

const posts = await Post.findAll({
offset: 5,
limit: 10,
})

创建对象

Prisma ORM

const user = await prisma.user.create({
data: {
email: '[email protected]',
},
})

Sequelize

const user = User.build({
name: 'Alice',
email: 'alice@prisma,io',
})
await user.save()

更新对象

Prisma ORM

const user = await prisma.user.update({
data: {
name: 'Alicia',
},
where: {
id: 2,
},
})

Sequelize

user.name = 'James'
user.email = ' [email protected]'
await user.save()

删除对象

Prisma ORM

const user = await prisma.user.delete({
where: {
id: 10,
},
})

Sequelize

await user.destroy()

批量更新

Prisma ORM

const user = await prisma.user.updateMany({
data: {
name: 'Published author!',
},
where: {
email: {
contains: 'prisma.io',
},
},
})

Sequelize

const updatedUsers = await User.update({
{ role: "Admin" },
where: {
email: {
[Op.like]: "%@prisma.io"
}
},
})

批量删除

Prisma ORM

const users = await prisma.user.deleteMany({
where: {
id: {
in: [1, 2, 6, 6, 22, 21, 25],
},
},
})

Sequelize

await User.destroy({
where: {
id: {
[Op.in]: [id1, id2, id3],
},
},
})

事务

Prisma ORM

const user = await prisma.user.create({
data: {
email: '[email protected]',
name: 'Bob Rufus',
Post: {
create: [
{ title: 'Working at Prisma' },
{ title: 'All about databases' },
],
},
},
})

Sequelize

return sequelize.$transaction(async (t) => {
const user = await User.create(
{
name: 'Alice',
email: 'alice@prisma,io',
},
{
transaction: t,
}
)
const post1 = await Post.create(
{
title: 'Join us for GraphQL Conf in 2019',
},
{
transaction: t,
}
)
const post2 = await Post.create(
{
title: 'Subscribe to GraphQL Weekly for GraphQL news',
},
{
transaction: t,
}
)
await user.setPosts([post1, post2])
})