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?

More than 3 years have passed since last update.

Script-Migration で生成した SQL スクリプトを Docker コンテナ内で実行する

Posted at

はじめに

過去に書いたこちら記事では、以下のことを行った

  1. Entity Framework Core のコマンドラインツールScript-Migrationを使って SQL スクリプト(.sqlファイル)を生成した
  2. 生成した 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を新規作成する

Powershell
cd ~
mkdir DockerShare

マウントするフォルダに.sqlファイルを配置する

生成済みのSQL スクリプト(.sqlファイル)を、Docker にマウントするディレクトリに配置する

Powershell
cp {.slnファイルがあるディレクトリ}\Intro\obj\Debug\netcoreapp3.1\jzy0rczc.sql .\DockerShare\

Dokcer の SQL Server コンテナ内で作業する

SQL サーバーのイメージはあらかじプルしてあるものとする
ここでは2019-latestをつかう

コンテナをたてる

過去に試した記事を参考に、ホームディレクトリにつくった**DockerShareをマウントしてコンテナをたてる**

Powershell
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という名前のコンテナが実行中であることがわかる

Powershell
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 の入力受付が>から/$に変わる

Powershell
docker exec -it sql2 "bash"

SQL スクリプトの所在を確認する

ルートディレクトリ直下のDockerShareの中に、さきほどcpしたjzy0rczc.sqlがある

bash
cd /DockerShare
ls
# jzy0rczc.sql

SQL Sever のコマンドsqlcmdでスクリプトを実行する

この章が本題となる

データベースを作り、そのデータベースに対して SQL スクリプトを実行する

データベースをつくる

以前とほぼ同じ手順Bloggingデータベースをつくる
※ 新しくコンテナを立てたばかりなので、DROP DATABASEは必要ない

bash
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -W
Password:

データベースを作ったら、QUITで抜ける

sqlcmd
1> CREATE DATABASE Blogging;
2> GO
1> QUIT

【本題】SQLスクリプトを実行する

SQL スクリプトが置かれているディレクトリにいることを確認した後
sqlcmd ... -i jzy0rczc.sqlで SQL スクリプトを実行する

bash
pwd
# /DockerShare

/opt/mssql-tools/bin/sqlcmd -U "sa" -S "localhost" -d Blogging -i jzy0rczc.sql -o script.log

SQL スクリプトを実行した結果

再度sqlcmdを実行する

bash
$ /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -W
Password:

BloggingデータベースにBlogsテーブルとPostsテーブルが生成され、
各テーブルの内容も期待したとおりの結果になっていることがわかる

sqlcmd
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オプションでログを指定した

bash
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 でやったほうが
手順書に落とすときなどに説明分の省スペース化が期待できる

参考にさせていただいた記事

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?