ASP.NET Core フレームワークを用いて文献管理システムを作る 【第9回 データベースの移行と接続】

1. 前回のあらすじ

CentOS にプロジェクトを移行し、デプロイしました。dotnet コマンドを利用し、ローカルホストでサーバを立てましたが、データベースのところでエラーになってしまいました。

2. 問題点と目標

問題点はデータベースが対応していないところです。なので、まずは LocalDB から MariaDB に移行し、文献データとユーザの登録データを参照できるようにします。移行作業が結構面倒です。

3. MariaDB の環境構築

MariaDB という MySQL系データベースを導入していきます。まずはインストールコマンドを実行します。

yum install mariadb mariadb-server

インストールできたら文字コードを変更します。Visual Studio で作成したプロジェクトは utf8 を使用しているのでこれを適用します。設定ファイルは /etc/my.cnf.d/server.cnf にあるので、このファイルを次のように編集します。

[mysqld]
character-set-server = utf8

これで文字コードが utf8 になります。続いて MariaDB の初期設定を行います。

mysql_secure_installation

すると、いくつか記入項目が出てきます。初期設定はこちらのページがとても参考になりますので、参考にしてください。

centossrv.com

初期設定ができたら起動してみてください。

mysql -u root -p

パスワードを入力してログインし、

show databases;

と入力すると登録されているデータベース一覧が表示されます。が、確認程度でいいです。実際には dotnet コマンド一つでデータベースを作成することができます。 確認出来たら MariaDB自動起動の設定と有効化してください。

sudo systemctl enable mariadb
sudo systemctl start mariadb

4. データベースの構築

Visual Studioでやったように dotnet コマンドを用いてデータベースを作成します。ターミナルを2つ起動して1つを dotnet 操作、もう1つをデータベース確認用で用意しておくことをおススメします。
まずはデータベースへの接続文字列を変更します。デフォルトのままでは (localdb)~ から始まっており、このままではデータベースを作成できません。そこで、この文字列を MariaDB 仕様に変更します。 appsettings.json を次のように編集します。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;User Id=root;Password=設定したパスワード;Database=ApplicationDbContext",
    "BooksDbContext": "Server=localhost;User Id=root;Password=設定したパスワード;Database=BooksDbContext"
  },
  "Logging": {
        "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

次に、Startup.cs の .UseSqlServer の部分を .UseMySql に変更します。これで localdb から MariaDB に変更できます。修正箇所はこんな感じです。画像では Visual Studio で編集していますが、Vim でもいいです。 f:id:takunology:20190623070559j:plain

編集できたら、プロジェクトディレクトリにて Identity 用のデータベースを作成します。

dotnet ef database update --context ApplicationDbContext

おそらくこのようなエラーが出ると思います。

dex column size too large. The maximum column size is 767 bytes.

が、これは無視してもいいです。ユーザ情報を登録しているテーブル AspNetUsers がデータベースに追加されていれば問題ありません。
続いて文献管理用のデータベースを構築します。

 sudo dotnet ef database update --context BooksDbContext

こちらはエラーなく Done. と表示されます。データベースが生成されているかは mysql コマンドで確認できます。

MariaDB [(none)]> show databases;
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| ApplicationDbContext |
| BooksDbContext       |
| mysql                |
| performance_schema   |
+----------------------+
5 rows in set (0.00 sec)

Identity と文献管理用のデータベースが生成されていますね。これで準備完了です。早速実行してみましょう。 f:id:takunology:20190623072120p:plain

文献一覧は問題なく動いていますね。続いてユーザを新規登録して文献を追加してみます。 f:id:takunology:20190623072443p:plain

f:id:takunology:20190623072515p:plain

f:id:takunology:20190623072540p:plain

f:id:takunology:20190623072612p:plain

ここまで順調です!
ちょっと編集してみましょう f:id:takunology:20190623072705p:plain

f:id:takunology:20190623072733p:plain

見たことのある画面ですね (笑)
この原因は文献データのキーが自動で割り振られるような設定になっていないのが原因です。なので、これを設定するために mysql のほうから変更してみます。変更に必要なコマンドは次の通りです。

ALTER TABLE `Books` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT FIRST;

このコマンドを使ってカラムの ID 部分を修正します。

MariaDB [(none)]> use BooksDbContext
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [BooksDbContext]> show tables;

+--------------------------+
| Tables_in_BooksDbContext |
+--------------------------+
| Books                    |
| __EFMigrationsHistory    |
+--------------------------+
2 rows in set (0.00 sec)

MariaDB [BooksDbContext]> ALTER TABLE `Books` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT FIRST;
Query OK, 1 row affected (0.00 sec)                
Records: 1  Duplicates: 0  Warnings: 0

ここまでできたら再度編集してみましょう。 f:id:takunology:20190623073712p:plain

削除もできるようになっていますね。 f:id:takunology:20190623073822p:plain

どうやらデータベースの移行はうまくいったようです。やることが多くて疲れました (これだけのためにプロジェクト作成からやり直してスクショも撮って)...。

5. まとめ

データベースの移行を行うために様々な設定を行いました。前回、追加機能で Pomelo.EntityFrameworkCore.MySql を導入しました。これは今回の mysql に接続するためのツールで、入っていないとデータベース接続ができなくなります。
ここまで長かったですが、CentOS7を用いてローカルホスト上で文献管理システムを動かすことができました。ここで切ってもいいのですが、せっかくなので dotnetApache を使って外部から接続できるように設定していきたいと思います。

お疲れさまでした。