PlanetScaleからTursoへの移行メモ → 断念🤨
背景
PlanetScaleがホビープランを廃止したため、移行先をTursoに変更するにあたっての手順を残す。
下記のサイトがとても参考になった!
MySQLの環境構築
まずはPCにmysqlコマンドが入ってなかったのでいれる
HomeBrewでmysqlコマンドをインストールする
brew install mysql
インストールできたか確認
mysql --version
mysql Ver 8.3.0 for macos14.2 on x86_64 (Homebrew)
mysql自体の起動、停止、ステータス確認コマンドのメモ
mysql.server stop
mysql.server status
mysql.server start
詳しくは下記が参考になりそう
PlanetScaleへの接続確認
PlanetScaleのダッシュボードより、DBへの接続情報を取得する
このとき接続方法はMySQL CLI
を選択する
mysql
コマンドで実際にアクセスできるか確認したところOK!
MySQLのダンプを作成する
mysqldump
コマンドを使うので、入ってるか確認。mysql
に付属してる感じか。
mysqldump --version
mysqldump Ver 8.3.0 for macos14.2 on x86_64 (Homebrew)
下記形式でコマンドを実行する必要がある
mysqldump -u <db-user> -h <hostname> -p --skip-extended-insert <db-name> > db_dump.sql
PlanetScaleの接続情報に置き換えて実行してみる
ダンプファイルできてた!
MySQLのダンプファイルをSQLiteに変換する
移行先のTurso
はSQliteベースなので、ダンプファイル変換対応が必要
その時に使うのがこれ↓
下記コマンド実行する
./mysql2sqlite db_dump.sql | sqlite3 dump-in-sqlite.db
うーん、エラーでてるな。CURRENT_TIMESTAMP
らへんか。
ChatGPTに聞いたところ、SQLite
のタイムスタンプ機能だとCURRENT_TIMESTAMP(3)
のように引数を渡すことができないことが原因みたいです。
なのでダンプファイル内のCURRENT_TIMESTAMP(3)
を全てCURRENT_TIMESTAMP
に変更する
再度実行してみると、うまくいった!
Turso CLIのインストール
Tursoにデータを移すには、Turso CLI
が必要なのでインストールする
brew install tursodatabase/tap/turso
turso
コマンドでインストールできたか確認
turso
Turso CLI
Usage:
turso [command]
Available Commands:
auth Authenticate with Turso
config Manage your CLI configuration
contact Reach out to the makers of Turso for help or feedback
db Manage databases
dev starts a local development server for Turso
group Manage your database groups
help Help about any command
org Manage your organizations
plan Manage your organization plan
quickstart New to Turso? Start here!
relax Sometimes you feel like you're working too hard... relax!
update Update the CLI to the latest version
Flags:
-c, --config-path string Path to the directory with config file
-h, --help help for turso
-v, --version version for turso
TursoCLIからログインする
turso auth login
でログインする
turso auth login
Opening your browser at:
https://api.turso.tech?port=64250&redirect=true&state=gRjb5C6F8IQHIanQ2MesXG6qXSxTI5Do&type=cli
Waiting for authentication...
✔ Success! Logged in as otaki0413
✏️ We are so happy you are here!
Now that you are authenticated, it is time to create a database:
turso db create
ログインに成功すると、下記ウィンドウが立ち上がる
データベースを作成する
先ほどSQLite用に変換させたダンプファイルがあるので、そこを起点にデータベースを作成する
turso db create
コマンドを使用する。
turso db create new-database --from-file db_dump_in_sqlite.db
コマンド実行する。現在地に最も近いリージョンで作成してくれるみたい。
CLIでselectしてみる
Tursoの管理画面を見ると、ちゃんとデータベースできてるね!
中のテーブル情報を確認できて、編集もできる(見た目がPrisma Studioぽい)
よし、次はアプリ側でPrismaを使ってるから、接続先をTursoに変えよう
Prismaスキーマの設定変更
現状のschema.prisma
はPlanetScale用の設定になっている↓
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
ドキュメントを参考にTurso用の設定に変えていく
まずは下記コマンドでデータベースへの接続文字列を取得(URLの部分)
turso db show <データベース名>
次にデータベースへの接続を許可する認証トークンを作成する
turso db tokens create <データベース名>
下記のように取得できる
.env
ファイルに認証トークンと接続文字列を追記
TURSO_AUTH_TOKEN="<認証トークン>"
TURSO_DATABASE_URL="<接続文字列>"
schema.prisma
も設定をTurso用に変更する
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"] // このプレビューフラグは必要
}
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
npx primsa generate
でPrismaクライアントを作成する
libSQLのDBクライアントとlibSQL用のPrisma ORM ドライバーアダプターをインストールする
npm install @libsql/client @prisma/adapter-libsql
これでサーバー起動すると、正常にアプリケーションが立ち上がるはず
データ型に関するエラー
まず前提として、SQLiteにDATETIME
型は存在していないから、それが原因ぽい。
DateTime
がSQLite側だと、NUMERIC
になるのね。。💦
参考になりそうな記事いくつか
現状、MySQLからSQLiteに移行すると、Prisma側での変更点が多そう。
既存コードの変更も多いため、Postgresに移行を検討しよう