概要
前回、SQLServer無料版を試した。
今回は、Prismaを使ってモデルファーストで開発したい。
Prisma を使った効率的なバックエンド開発ワークフローに従おうとしたが、prisma migrate dev --create-only --name newMigration
でmigrationsを作ることに失敗した。Prismaには、シャドウデータベースという、もう一つのデータベースが必要なようだ。
シャドウ データベースの作成の動画もあったが、無料枠のDBは一つなので断念。ローカルのDBをシャドウデータベースとして試してみる。
ローカル開発環境の構築
Azure SQL Database のローカル発環境用のプロジェクトを作成するに沿って構築しようとしたが、途中で面倒になった。
面倒になるまで
Azure SQL Database のローカル開発環境を設定するの手順通り、mssqlをVSCodeに導入。Docker Desktopは既に導入済だった。
Azure SQL Database のローカル発環境用のプロジェクトを作成するの手順にそって進めていく。
今回は、「Azure SQL Database」を選択し、プロジェクト名は「YakumiDB」とした。
プロジェクトをビルドして公開するの手順を行う。
.NET 6 が必要だよって言われて面倒になってきた。
Azure 向け開発のためのローカルリソース準備 より、Dockerを使った構築に切り替える。
services:
mssql:
image: mcr.microsoft.com/mssql/server:2022-latest
user: root
container_name: mssql
ports:
- 127.0.0.1:1433:1433
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>
- MSSQL_PID=Developer
- MSSQL_COLLATION=Japanese_CI_AS
#!/bin/bash
bin_dir=$(cd $(dirname $0) && pwd)
docker_dir=$(cd $bin_dir/.. && pwd)
composeFile=${1:-"docker-compose.yml"}
cd $docker_dir && docker-compose -f $composeFile up
#!/bin/bash
bin_dir=$(cd $(dirname $0) && pwd)
docker_dir=$(cd $bin_dir/.. && pwd)
container_name=${1:-mssql}
docker ps | grep $container_name
if [ $? -eq 0 ]; then
cd $docker_dir && docker-compose exec $container_name bash
else
cd $docker_dir && docker-compose run --service-ports $container_name bash
fi
./bin/up.sh
でDockerを立ち上げる。
./bin/bash.sh
でコンテナ内に入り、SQL Server on Dockerに従ってquickstart
データベースを作成する。
sqlcmdの立ち上げ
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P MyPassword123
クエリの実行
CREATE DATABASE quickstart
GO
データベースに接続できることを確認する。
Username: SA
Password: <YourStrong@Passw0rd>
Database: quickstart
Port: 1433
マイグレーションファイルの作成
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlserver"
url = env("DATABASE_URL")
shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
}
model Test {
id String @id
data String
created DateTime @default(now()) @db.DateTime
updated DateTime @default(now()) @updatedAt @db.DateTime
}
DATABASE_URL=sqlserver://hoge.database.windows.net:1433;database=fuga;user=piyo;password=piyopiyo;encrypt=true
SHADOW_DATABASE_URL=sqlserver://localhost:1433;database=quickstart;username=SA;password=<YourStrong@Passw0rd>;trustServerCertificate=true;
prisma migrate dev --create-only --name newMigration
を実行したところ、All data will be lost
とのこと。Docker内で作ったばかりのデータベースなので、失うものはなにもない。y
を選択。
ぶじ、migrations
フォルダ内にマイグレーション用SQLが作成された。
BEGIN TRY
BEGIN TRAN;
-- CreateTable
CREATE TABLE [dbo].[Test] (
[id] NVARCHAR(1000) NOT NULL,
[data] NVARCHAR(1000) NOT NULL,
[created] DATETIME NOT NULL CONSTRAINT [Test_created_df] DEFAULT CURRENT_TIMESTAMP,
[updated] DATETIME NOT NULL CONSTRAINT [Test_updated_df] DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT [Test_pkey] PRIMARY KEY CLUSTERED ([id])
);
COMMIT TRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN;
END;
THROW
END CATCH
Azure SQL Databaseに反映
prisma migrate deploy
を実行。
select * from Test;
テーブルが作成されたことを確認した。
select * from dbo._prisma_migrations;
マイグレーションの履歴も残っていることを確認。
参考
Azure 向け開発のためのローカルリソース準備
Azure SQL Database のローカル開発エクスペリエンスとは
Azure Data Studioのプレビュー機能を駆使してローカルのSQLサーバを構築してみた
SQL Server
Prisma を使った効率的なバックエンド開発ワークフロー
PrismaでSQLの作成や管理、反映の手間を削減する