Closed12

PlanetScaleからTursoへの移行メモ → 断念🤨

KeiKei

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

詳しくは下記が参考になりそう
https://qiita.com/fuwamaki/items/194c2a82bd6865f26045

KeiKei

PlanetScaleへの接続確認

PlanetScaleのダッシュボードより、DBへの接続情報を取得する
このとき接続方法はMySQL CLIを選択する

mysqlコマンドで実際にアクセスできるか確認したところOK!

KeiKei

MySQLのダンプを作成する

mysqldumpコマンドを使うので、入ってるか確認。mysqlに付属してる感じか。

mysqldump --version
mysqldump  Ver 8.3.0 for macos14.2 on x86_64 (Homebrew)

https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c

下記形式でコマンドを実行する必要がある

mysqldump -u <db-user> -h <hostname> -p --skip-extended-insert <db-name> > db_dump.sql

PlanetScaleの接続情報に置き換えて実行してみる

ダンプファイルできてた!

KeiKei

MySQLのダンプファイルをSQLiteに変換する

移行先のTursoはSQliteベースなので、ダンプファイル変換対応が必要

その時に使うのがこれ↓
https://github.com/dumblob/mysql2sqlite

下記コマンド実行する

./mysql2sqlite db_dump.sql | sqlite3 dump-in-sqlite.db

うーん、エラーでてるな。CURRENT_TIMESTAMPらへんか。

ChatGPTに聞いたところ、SQLiteのタイムスタンプ機能だとCURRENT_TIMESTAMP(3)のように引数を渡すことができないことが原因みたいです。

なのでダンプファイル内のCURRENT_TIMESTAMP(3)を全てCURRENT_TIMESTAMPに変更する

再度実行してみると、うまくいった!

KeiKei

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

https://docs.turso.tech/cli/installation

KeiKei

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

ログインに成功すると、下記ウィンドウが立ち上がる

https://docs.turso.tech/cli/authentication

KeiKei

データベースを作成する

先ほどSQLite用に変換させたダンプファイルがあるので、そこを起点にデータベースを作成する

turso db createコマンドを使用する。

turso db create new-database --from-file db_dump_in_sqlite.db

https://docs.turso.tech/cli/db/create

コマンド実行する。現在地に最も近いリージョンで作成してくれるみたい。

CLIでselectしてみる

Tursoの管理画面を見ると、ちゃんとデータベースできてるね!

中のテーブル情報を確認できて、編集もできる(見た目がPrisma Studioぽい)

KeiKei

よし、次はアプリ側でPrismaを使ってるから、接続先をTursoに変えよう

KeiKei

Prismaスキーマの設定変更

現状のschema.prismaはPlanetScale用の設定になっている↓

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

ドキュメントを参考にTurso用の設定に変えていく
https://www.prisma.io/docs/orm/overview/databases/turso
https://docs.turso.tech/sdk/ts/orm/prisma#prerequisites

まずは下記コマンドでデータベースへの接続文字列を取得(URLの部分)

turso db show <データベース名>

次にデータベースへの接続を許可する認証トークンを作成する

turso db tokens create <データベース名>

下記のように取得できる

.envファイルに認証トークンと接続文字列を追記

.env
TURSO_AUTH_TOKEN="<認証トークン>"
TURSO_DATABASE_URL="<接続文字列>"

schema.prismaも設定をTurso用に変更する

schema.prisma
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

これでサーバー起動すると、正常にアプリケーションが立ち上がるはず

KeiKei

データ型に関するエラー

まず前提として、SQLiteにDATETIME型は存在していないから、それが原因ぽい。

DateTimeがSQLite側だと、NUMERICになるのね。。💦

参考になりそうな記事いくつか

https://www.prisma.io/docs/orm/overview/databases/sqlite#native-type-mapping-from-prisma-orm-to-sqlite
https://dev.to/chingu/use-prisma-with-an-sqlite-datetime-datatype-29o9
https://sfnovicenotes.blogspot.com/2022/01/sqlite3_01559761201.html
https://zenn.dev/toraco/articles/831e6bec85d3a3

KeiKei

現状、MySQLからSQLiteに移行すると、Prisma側での変更点が多そう。
既存コードの変更も多いため、Postgresに移行を検討しよう

このスクラップは2024/03/17にクローズされました