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

MongoDBベータ版からのアップグレード

はじめに

このガイドは、Prisma 1 MongoDBベータ版からPrisma ORM 2以降のMongoDBへの移行を支援します。Prisma 1とPrisma ORM 2.x以降の違いについては、このドキュメントを参照してください。

このガイドの範囲は、移行を実行するために必要なワークフローを提供し、遭遇する可能性のあるいくつかの問題を強調することです。

残念ながら、すべての可能性のあるシナリオや必要な変更を網羅することはできませんが、このガイドはあなたの旅の助けになるはずです。Discordに参加するか、質問がある場合はGithubでissueを作成してください

警告

本番環境で試す前に、ステージング環境でこの移行を実行してください!

要件

  • MongoDB 4.2+をレプリカセットとして実行している必要があります(MongoDB Atlasはこれを自動的に行います)
  • Node.js: システム要件を参照
  • TypeScript: システム要件を参照

Prisma ORM 3.12.0以降のインストール

プロジェクトディレクトリで以下のコマンドを実行します

npm install prisma@latest && npm install @prisma/client
npx prisma init --datasource-provider=mongodb

これにより、以下のファイルが作成されます

  • prisma/schema.prisma: 初期Prismaスキーマ
  • .env: 接続文字列を保存する環境ファイル
情報

以下のエラーが表示された場合

ERROR  File schema.prisma already exists in your project.
Please try again in a project that is not yet using Prisma.

プロジェクト内にすでにprisma/ディレクトリが存在している可能性があります。そのディレクトリを_prisma/のような名前に変更して、再度試してください

MongoDBデータベースへの接続文字列を見つける

次に、MongoDBデータベースへの接続文字列を見つける必要があります。これはdocker-compose.ymlファイルまたはMongoDB Atlasで見つけることができるはずです。MongoDB Compassに渡すものと同じです。接続文字列は次のようになります。

mongodb://<user>:<pass>@<host>:27017

Prisma 1でアプリケーションデータを保存するデータベースはdefault_defaultと呼ばれています。そのため、接続文字列の末尾にこれを追加し、.envファイル内のDATABASE_URLキーを更新します。

.env
DATABASE_URL="mongodb://prisma:prisma@localhost:27017/default_default"

MongoDBデータベースをイントロスペクトする

これで、データベースの構造をPrismaスキーマにプルダウンする準備ができました。

$ npx prisma db pull

そして、prisma/schema.prismaにあなたのモデルが設定されたPrismaスキーマが表示されるはずです。

情報

以下のエラー:「Error in connector: SCRAM failure: Authentication failed.」が表示された場合は、接続文字列の末尾に?authSource=adminを追加して再度試してください。

Prismaスキーマを修正する

新しくイントロスペクトされたPrisma 1ベースのMongoDBデータベースから生成されたPrisma Clientは、最適なAPIではない可能性があります。モデル名とフィールドを調整できますが、元の名前を基盤となるデータベースのコレクション名とフィールド名に@mapおよび@@mapでマッピングするようにしてください。

- model posts {
+ model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
published Boolean
title String
+ @@map("posts")
}

- model users {
+ model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique(map: "email_U")
name String
- posts String[] @db.ObjectId
+ postIds String[] @db.ObjectId @map("posts")

@@index([posts], map: "posts_R")
+ @@map("users")
}

これらの名前変更を行う際には注意が必要です。なぜなら、Prismaスキーマが基盤となるデータベースのコレクション名とフィールド名に正しくマッピングされていることを確認する必要があるからです。

SQLデータベースとは異なり、MongoDBにはデータ間の関係に関する明示的な理解がありません。これは、Prisma ORMのイントロスペクションがそれらの関係を推測できないことを意味します。

通常、このドキュメントを参考に手動で関係を追加することをお勧めします。ただし、Prisma 1は外部キーをPrisma ORM 2以降が期待する場所とは異なる場所に格納するため、関係を利用したい場合は、関係を追加する前にデータベース上の外部キーの位置を変更する必要があります。

ヒント

💡 Prismaスキーマの移行中にオートコンプリートと役立つエラーメッセージを提供するために、Prisma VSCode拡張機能をダウンロードしてください。

Prisma Clientの生成

データスキーマでPrismaスキーマが入力されたら、MongoDBデータベースへの読み書きを行うためのTypeScript Clientを生成する準備ができました。

$ npx prisma generate

読み込みのテスト

Prisma Clientがアプリケーションに読み書きできることを確認するために、簡単なtest.tsスクリプトを作成します。このガイドでは、Prisma 1のサンプルリポジトリの例を使用していますが、コードはアプリケーションによって異なります。

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

async function main() {
await prisma.$connect()
const posts = await prisma.post.findMany()
console.log(posts)
}

main()
.catch(console.error)
.finally(() => prisma.$disconnect())

ts-nodeがグローバルにインストールされていることを確認し、実行します

ts-node test.ts

データのリストが表示されるはずです

[
{
comments: [],
id: '62435a83fca136000996ba16',
content: 'https://prisma.dokyumento.jp/day/',
published: true,
title: 'Join us for Prisma Day 2019 in Berlin',
wasCreated: 2022-03-29T19:14:11.172Z,
wasUpdated: 2022-03-29T19:14:11.172Z
},
{
comments: [ [Object] ],
id: '62435a83fca136000996ba18',
content: 'https://graphqlweekly.com/',
published: true,
title: 'Subscribe to GraphQL Weekly for community news',
wasCreated: 2022-03-29T19:14:11.369Z,
wasUpdated: 2022-03-29T19:14:11.369Z
},
{
comments: [],
id: '62435a83fca136000996ba1a',
content: 'https://twitter.com/prisma',
published: false,
title: 'Follow Prisma on Twitter',
wasCreated: 2022-03-29T19:14:11.375Z,
wasUpdated: 2022-03-29T19:14:11.375Z
}
]

書き込みのテスト

その後、test.tsを変更して書き込みを試すことができます

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

async function main() {
await prisma.$connect()
const user = await prisma.user.create({
data: {
email: 'alice@prisma.io',
name: 'Alice',
},
})
console.log(user)
}

main()
.catch(console.error)
.finally(() => prisma.$disconnect())

ユーザーが作成されたことが表示されるはずです。

警告

以下のエラーが表示された場合

Prisma needs to perform transactions, which requires your MongoDB server to be run as a replica set. https://pris.ly/d/mongodb-replica-set

これは、MongoDBデータベースがレプリカセットとして実行されていないことを意味します。この問題を解決するための手順については、上記のリンクを参照してください。

アプリケーションのアップグレード

動作するPrisma Clientができたので、Prisma Client 1のクエリを最新のPrisma Clientクエリに置き換え始めることができます。Prisma Client Referenceは、最新のPrisma Clientの使用方法を学ぶための役立つリソースです。

結論

この簡単なガイドが、正しい道を歩み始めるのに役立ったことを願っています。ご質問や問題がある場合はお知らせください。長年にわたるご支援に心から感謝いたします。

© . All rights reserved.