docs/1.34/understand-prisma/prisma-vs-traditional-orms/prisma-vs-sequelize-c4fk.mdx
import Code from "components/Markdown/Code" import Icon from 'components/Markdown/Icon' import Info from 'components/Markdown/Info'
export const meta = { title: "Prisma & Sequelize", position: 70, description: "Learn how Prisma 1 compares to Sequelize" }
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>This page compares Prisma with Sequelize. Here is a high-level overview:
| Prisma | Sequelize | |
|---|---|---|
| Auto-generated DB client | <Icon type="check" /> | <Icon type="cross" /> |
| Type-safe | <Icon type="check" /> | <Icon type="cross" /> |
| Declarative data modelling & migrations | <Icon type="check" /> | <Icon type="cross" /> |
| Connection pooling | <Icon type="check" /> | <Icon type="check" /> |
| Supported DB types | Document & Relational | Relational |
| Supported ORM patterns | DataMapper | ActiveRecord |
| Fluent API for relations | <Icon type="check" /> | <Icon type="cross" /> |
| Relation filters | <Icon type="check" /> | <Icon type="cross" /> |
| Raw database access | <Icon type="check" /> | <Icon type="check" /> |
| Transactional nested writes | <Icon type="check" /> | <Icon type="check" /> |
| Manual transactions | <Icon type="cross" /> | <Icon type="check" /> |
In the following, you find a detailled comparison of the Sequelize and Prisma APIs.
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const user = await prisma.user({ id })
Sequelize
const user = await User.findByPk(id)
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const userFragment = await prisma.user({ id }).$fragment(`
fragment NameAndEmail on User { id email }`
`)
Sequelize
const user = await User.findByPk(id, attributes: {
["name", "email"]
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
<Code hideCopy={true} 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 }
)
While the
$fragmentand the$graphqlAPIs each return auserobject that includes apostsarray, the fluent API returns just thepostsarray and no data about theuser.
See the following GitHub issues to learn more about planned iterations of the Prisma client relations API:
Sequelize
const user = await User.findByPk(id, {
include: [{
model: Post
}]
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const users = await prisma.users({
where: {
name: "Alice"
}
})
Sequelize
const user = User.findAll({
where: {
name: "Alice"
}
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>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 has an extensive set of operators to be found here.
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>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":
query {
user(where: {
posts_some: {
title: "Hello World"
}
}) {
id
}
}
Sequelize
Sequelize doesn't offer a dedicated API for relation filters. You can get similar functionality by sending a raw SQL query to the database.
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>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
const posts = await Post.findAll({
offset: 5,
limit: 10
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const user = await prisma.createUser({
name: "Alice",
email: "[email protected]"
})
Sequelize
<Code hideCopy={true} languages={["Using save", "Using create"]}>
const user = User.build({
name: "Alice",
email: "alice@prisma,io"
})
await user.save()
const user = await User.create({
name: "Alice",
email: "alice@prisma,io"
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const updatedUser = await prisma.updateUser({
where: { id },
data: {
name: "James",
email: "[email protected]"
}
})
Sequelize
<Code hideCopy={true} languages={["Using save", "Using update"]}>
user.name = "James"
user.email =" [email protected]"
await user.save()
await User.update({
name: "James",
email: "[email protected]"
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const deletedUser = await prisma.deleteUser({ id })
Sequelize
await user.destroy()
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const updatedUsers = await prisma
.updateManyUsers({
data: { role: "ADMIN" },
where: {
email_ends_with: "@prisma.io"
}
})
Sequelize
const updatedUsers = await User.update({
{ role: "Admin" },
where: {
email: {
[Op.like]: "%@prisma.io"
}
},
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
await prisma.deleteManyUsers({
id_in: [id1, id2, id3]
})
Sequelize
await User.destroy({
where: {
id: {
[Op.in]: [id1, id2, id3]
}
}
})
This page is outdated! It compares Prisma 1 with Sequelize. You can find an updated version comparing Sequelize with Prisma 2 here.
</Info>Prisma
const newUser = await prisma.createUser({
name: "Bob",
email: "[email protected]",
posts: {
create: [
{ title: "Join us for GraphQL Conf in 2019" },
{ title: "Subscribe to GraphQL Weekly for GraphQL news" }
]
}
})
Sequelize
<Code hideCopy={true} 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()
}
})