はじめに
過去に書いたこちら記事では、以下のことを行った
- Entity Framework Core のコマンドラインツール
Script-Migration
を使って SQL スクリプト(.sql
ファイル)を生成した - 生成した SQL スクリプト(
.sql
ファイル)をSSMSで開いて実行した
この記事では
生成した SQL スクリプト(.sql
ファイル)をSSMSではなく、コマンドラインから実行する
生成した SQL スクリプト(.sql
ファイル)の内容については、過去の記事の付録を参照のこと
環境
- Windows 10 Home
- Docker version 20.10.8, build 3967b7d
- Microsoft.EntityFrameworkCore 5.0.9
SQL スクリプトを準備する
SQLスクリプトは生成済みのものを使う
.sql
ファイルの場所と名前は{.slnファイルがあるディレクトリ}\Intro\obj\Debug\netcoreapp3.1\jzy0rczc.sql
である
Docker にマウントするフォルダをつくる
ホームディレクトリにフォルダDockerShare
を新規作成する
cd ~
mkdir DockerShare
マウントするフォルダに.sql
ファイルを配置する
生成済みのSQL スクリプト(.sql
ファイル)を、Docker にマウントするディレクトリに配置する
cp {.slnファイルがあるディレクトリ}\Intro\obj\Debug\netcoreapp3.1\jzy0rczc.sql .\DockerShare\
Dokcer の SQL Server コンテナ内で作業する
SQL サーバーのイメージはあらかじプルしてあるものとする
ここでは2019-latest
をつかう
コンテナをたてる
過去に試した記事を参考に、ホームディレクトリにつくった**DockerShare
をマウントしてコンテナをたてる**
docker run -itv /C/Users/t1380/DockerShare:/DockerShare --name sql2 -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SqlPass1234' -p 21433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
ポート21433
で通信するsql2
という名前のMicrosoft SQL Server 2019
コンテナが生成される
検証なのでパスワードが見えているが、ふつうは公開すべきものではないと思う
実行中のコンテナを表示する
sql2
という名前のコンテナが実行中であることがわかる
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 7220012a9cbc mcr.microsoft.com/mssql/server:2019-latest "/opt/mssql/bin/perm…" 1 second ago Up 2 seconds 0.0.0.0:21433->1433/tcp, :::21433->1433/tcp sql2
コンテナに入る
コンテナに入ると Powershell の入力受付が>
から/$
に変わる
docker exec -it sql2 "bash"
SQL スクリプトの所在を確認する
ルートディレクトリ直下のDockerShare
の中に、さきほどcp
したjzy0rczc.sql
がある
cd /DockerShare
ls
# jzy0rczc.sql
SQL Sever のコマンドsqlcmd
でスクリプトを実行する
この章が本題となる
データベースを作り、そのデータベースに対して SQL スクリプトを実行する
データベースをつくる
以前とほぼ同じ手順でBlogging
データベースをつくる
※ 新しくコンテナを立てたばかりなので、DROP DATABASE
は必要ない
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -W
Password:
データベースを作ったら、QUIT
で抜ける
1> CREATE DATABASE Blogging;
2> GO
1> QUIT
【本題】SQLスクリプトを実行する
SQL スクリプトが置かれているディレクトリにいることを確認した後
sqlcmd ... -i jzy0rczc.sql
で SQL スクリプトを実行する
pwd
# /DockerShare
/opt/mssql-tools/bin/sqlcmd -U "sa" -S "localhost" -d Blogging -i jzy0rczc.sql -o script.log
SQL スクリプトを実行した結果
再度sqlcmd
を実行する
$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -W
Password:
Blogging
データベースにBlogs
テーブルとPosts
テーブルが生成され、
各テーブルの内容も期待したとおりの結果になっていることがわかる
1> USE Blogging;
2> GO
Changed database context to 'Blogging'.
1> SELECT * FROM Blogs;
2> GO
BlogId Url Rating
------ --- ------
11 http://one.com 0
22 http://two.com 0
(2 rows affected)
1> SELECT * FROM Posts;
2> GO
PostId Title Content BlogId
------ ----- ------- ------
11 title11 content11 11
22 title12 content12 11
33 title23 content23 22
44 title24 content24 22
(4 rows affected)
(おまけ)script.log の中身は?
SQL スクリプトを実行したときに-o
オプションでログを指定した
cat /DockerShare/script.log
(1 rows affected)
(1 rows affected)
(1 rows affected)
(4 rows affected)
(1 rows affected)
SSMSで実行したときの出力と同じであることがわかる
おわりに
以前 SSMS で実行した SQL スクリプトを CLI から実行することができた
こちらの記事「自己流の手順書フォーマットを公開してみた」でも言及されているが
同じことを GUI でやるより CLI でやったほうが
手順書に落とすときなどに説明分の省スペース化が期待できる
参考にさせていただいた記事