docs/1.23/understand-prisma/prisma-vs-traditional-orms/prisma-vs-sequelize-c4fk.mdx
import Code from "components/Markdown/Code"
export const meta = { title: "Prisma & Sequelize", position: 70, description: "Learn how Prisma compares to Sequelize" }
Sequelize
const user = await User.findByPk(id)
Prisma
const user = await prisma.user({ id })
Sequelize
const user = await User.findByPk(id, attributes: {
["name", "email"]
})
Prisma
const userFragment = await prisma.user({ id }).$fragment(`
fragment NameAndEmail on User { id email }`
`)
Sequelize
const user = await User.findByPk(id, {
include: [{
model: Post
}]
})
Prisma
<Code languages={["Fluent API", "Using fragments", "Native GraphQL"]}>
const postsByUser = await prisma
.user({ id })
.posts()
const userWithPosts = await prisma
.user({ id })
.$fragment(`
fragment UserPosts on User {
posts { id title content published }
}
`)
const userWithPosts = await prisma
.$graphql(`
query ($id: ID!) {
user(id: $id) {
posts { id title content published }
}
}
`,
{ id }
)
Sequelize
const user = User.findAll({
where: {
name: "Alice"
}
})
Prisma
const user = await prisma.users({
where: {
name: "Alice"
}
})
Sequelize
Sequelize has an extensive set of operators to be found here.
Prisma
Prisma generates many additional filters that are commonly used in modern application development:
<field>_ends_with & <field>_starts_with<field>_not_ends_with & <field>_not_starts_with<field>_gt & <field>_gte<field>_lt & <field>_lte<field>_contains & <field>_not_contains<field>_in & <field>_not_inSequelize
Sequelize doesn't offer a dedicated API for relation filters. You can get similar functionality by sending a raw SQL query to the database.
Prisma
Prisma lets you filter a list based on a criteria that applies not only to the models of the list being retrieved, but to a relation of that model.
For example, you want to fetch only those users that wrote a post with the title "Hello World". The filter criteria is therefore not referencing the user model, but the post model that's related to the user model:
query {
user(where: {
posts_some: {
title: "Hello World"
}
}) {
id
}
}
Sequelize
const posts = await Post.findAll({
offset: 5,
limit: 10
})
Prisma
const posts = await prisma.posts({
skip: 5,
first: 10
})
In addition to skip and first, the Prisma API also offers:
lastbefore & after for cursor based paginationSequelize
<Code languages={["Using save", "Using create"]}>
const user = await User.build({
name: "Alice",
email: "alice@prisma,io"
})
await user.save()
const user = await User.create({
name: "Alice",
email: "alice@prisma,io"
})
Prisma
const user = await new User({
name: "Alice",
email: "[email protected]"
})
Sequelize
<Code languages={["Using save", "Using update"]}>
user.name = "James"
user.email =" [email protected]"
await user.save()
await user.update({
name: "James",
email: "[email protected]"
})
Prisma
const updatedUser = await prisma.updateUser({
where: { id },
data: {
name: "James",
email: "[email protected]"
}
})
Sequelize
await user.destroy()
Prisma
const deletedUser = await prisma.deleteUser({ id })
Sequelize
const updatedUsers = await User.update({
{ role: "Admin" },
where: {
email: {
[Op.like]: "%@prisma.io"
}
},
})
Prisma
const updatedUsers = await prisma
.updateManyUsers({
data: { role: "ADMIN" },
where: {
email_ends_with: "@prisma.io"
}
})
Sequelize
await User.destroy({
where: {
id: {
[Op.in]: [id1, id2, id3]
}
}
})
Prisma
await prisma.deleteManyUsers({
id_in: [id1, id2, id3]
})
Sequelize
<Code languages={["Manual", "Automatic"]}>
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])
})
return sequelize.transaction(async transaction => {
try {
const user = await User.create({
name: "Alice",
email: "alice@prisma,io"
})
const post1 = await Post.create({
title: "Join us for GraphQL Conf in 2019"
})
const post2 = await Post.create({
title: "Subscribe to GraphQL Weekly for GraphQL news"
})
await user.setPosts([post1, post2])
} catch(e) {
return t.rollback()
}
})
Prisma
const newUser: User = await prisma.createUser({
name: "Bob",
email: "[email protected]",
posts: {
create: [
{
title: "Join us for GraphQL Conf in 2018"
},
{
title: "Subscribe to GraphQL Weekly for GraphQL news"
}
]
}
})