MongoDB Beta からのアップグレード
はじめに
このガイドは、Prisma 1 MongoDB Beta から 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
$ 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 キーを更新します
DATABASE_URL="mongodb://prisma:prisma@localhost:27017/default_default"
MongoDB データベースをイントロスペクトする
これで、データベースの構造を Prisma スキーマにpull downする準備が整いました。
$ npx prisma db pull
そして、prisma/schema.prisma の Prisma スキーマがモデルでpopulateされているはずです。
次のエラーが表示された場合: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 VSCode 拡張機能をダウンロードして、Prisma スキーマを移行する際にオートコンプリートと役立つエラーメッセージを提供します。
Prisma Client を生成する
データスキーマでpopulateされたPrismaスキーマを使用して、MongoDB データベースを読み書きするための Typescript クライアントを生成する準備が整いました。
$ npx prisma generate
読み取りのテスト
Prisma Client がアプリケーションを読み書きできることを検証するために、簡単な test.ts
スクリプトを作成します。このガイドは Prisma 1 の examples リポジトリ の例を使用していますが、コードはアプリケーションによって異なることに注意してください。
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 リファレンスは、最新の Prisma Client の使用方法を学ぶのに役立つリソースです。
結論
この簡単なガイドが、正しい道を進むためのお役に立てれば幸いです。ご質問や問題点がありましたらお知らせください。長年のご支援に心から感謝いたします。