Sequelize
このページでは、Prisma ORMとSequelize APIを比較します。
Sequelize vs Prisma ORM
Prisma ORMとSequelizeは同様の問題を解決しますが、その動作方法は大きく異なります。
Sequelize は、*テーブル* を *モデルクラス* にマッピングする従来のORMです。モデルクラスのインスタンスは、ランタイム時にアプリケーションへのCRUDクエリのインターフェースを提供します。
Prisma ORM は、肥大化したモデルインスタンス、ビジネスロジックとストレージロジックの混在、型安全性の欠如、または遅延ロードなどによって引き起こされる予測不可能なクエリなど、従来のORMの多くの問題を軽減する新しい種類のORMです。
Prismaスキーマを使用して、アプリケーションモデルを宣言的に定義します。 Prisma Migrateを使用すると、Prismaスキーマから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 })
プレーンなJavaScriptオブジェクトを返すには、raw: true
クエリオプションを使用してください。
リレーションのフェッチ
Prisma ORM
include
を使用- Fluent API
const posts = await prisma.user.findUnique({
where: {
id: 2,
},
include: {
post: true,
},
})
const posts = await prisma.user
.findUnique({
where: {
id: 2,
},
})
.post()
注意:
select
はpost
配列を含むuser
オブジェクトを返しますが、fluent APIはpost
配列のみを返します。
Sequelize
const user = await User.findByPk(id, {
include: [
{
model: Post,
},
],
})
User.hasMany(Post, { as: "Post", foreignKey: "authorId" });
など、エイリアスを使用して User
と Post
の間のリレーションシップを定義した場合、model: Post as "Post"
を使用してください。
具体的な値によるフィルタリング
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
save
を使用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',
})
オブジェクトの更新
Prisma ORM
const user = await prisma.user.update({
data: {
name: 'Alicia',
},
where: {
id: 2,
},
})
Sequelize
save
を使用update
を使用
user.name = 'James'
user.email = ' alice@prisma.com'
await user.save()
await User.update({
name: 'James',
email: 'james@prisma.io',
})
オブジェクトの削除
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])
})
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 transaction.rollback()
}
})
Prismaとのつながりを維持する
以下と繋がることでPrismaの旅を続けましょう アクティブなコミュニティ。 最新情報を入手し、参加して、他の開発者と協力しましょう
- Xでフォローしてください お知らせ、ライブイベント、および役立つヒントを入手できます。
- Discordに参加してください 質問をしたり、コミュニティと話したり、会話を通じてアクティブなサポートを受けることができます。
- YouTubeでチャンネル登録してください チュートリアル、デモ、およびストリームを入手できます。
- GitHubでエンゲージする リポジトリにスターを付けたり、問題を報告したり、問題に貢献したりできます。