0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

無料のAzure SQL DatabaseにPrismaを使ってモデルファーストでテーブルを作成したメモ

Last updated at Posted at 2024-04-27

概要

前回、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 のローカル発環境用のプロジェクトを作成するの手順にそって進めていく。

image.png

今回は、「Azure SQL Database」を選択し、プロジェクト名は「YakumiDB」とした。

image.png

プロジェクトをビルドして公開するの手順を行う。

.NET 6 が必要だよって言われて面倒になってきた。

image.png

Azure 向け開発のためのローカルリソース準備 より、Dockerを使った構築に切り替える。

環境変数

docker-compose.yml
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/up.sh
#!/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.sh
#!/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

image.png

データベースに接続できることを確認する。

Username: SA
Password: <YourStrong@Passw0rd>
Database: quickstart
Port: 1433

image.png

マイグレーションファイルの作成

schema.prisma
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
}
.env
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を選択。

image.png

ぶじ、migrationsフォルダ内にマイグレーション用SQLが作成された。

migrations/yyyyMMddHHmmss_new_migration/migration.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;

マイグレーションの履歴も残っていることを確認。

image.png

参考

Azure 向け開発のためのローカルリソース準備
Azure SQL Database のローカル開発エクスペリエンスとは
Azure Data Studioのプレビュー機能を駆使してローカルのSQLサーバを構築してみた
SQL Server
Prisma を使った効率的なバックエンド開発ワークフロー
PrismaでSQLの作成や管理、反映の手間を削減する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?