メインコンテンツへスキップ

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クエリは、Node.jsおよびTypeScript用の軽量で完全に型安全なデータベースクライアントであるPrisma Clientによって提供されます。

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` オブジェクトを返しますが、Fluent APIは `post` 配列のみを返します。

Sequelize

const user = await User.findByPk(id, {
include: [
{
model: Post,
},
],
})
ヒント

もし`User`と`Post`間のリレーションシップを定義するためにエイリアスを使用した場合は、`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」を含む1つ以上の投稿を持つユーザーを返します

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: 'alice@prisma.io',
},
})

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 = ' alice@prisma.com'
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: 'bob.rufus@prisma.io',
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])
})

Prismaとのつながり

Prismaの旅を続けるには、 活発なコミュニティに参加しましょう。最新情報を入手し、積極的に関わり、他の開発者と協力できます。

  • Xをフォロー アナウンス、ライブイベント、役立つヒントをチェックしてください。
  • Discordに参加 質問したり、コミュニティと交流したり、会話を通じて活発なサポートを受けたりできます。
  • YouTubeを購読 チュートリアル、デモ、ストリームをご覧ください。
  • GitHubでエンゲージ リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりしてください。
皆様のご参加を心より歓迎し、コミュニティの一員となっていただけることを楽しみにしております!

© . All rights reserved.