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
キーを更新します。
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の使用方法を学ぶための役立つリソースです。
結論
この簡単なガイドが、正しい道を歩み始めるのに役立ったことを願っています。ご質問や問題がある場合はお知らせください。長年にわたるご支援に心から感謝いたします。