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
すると、いくつか記入項目が出てきます。初期設定はこちらのページがとても参考になりますので、参考にしてください。
初期設定ができたら起動してみてください。
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 でもいいです。
編集できたら、プロジェクトディレクトリにて 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 と文献管理用のデータベースが生成されていますね。これで準備完了です。早速実行してみましょう。
文献一覧は問題なく動いていますね。続いてユーザを新規登録して文献を追加してみます。
ここまで順調です!
ちょっと編集してみましょう
見たことのある画面ですね (笑)
この原因は文献データのキーが自動で割り振られるような設定になっていないのが原因です。なので、これを設定するために 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
ここまでできたら再度編集してみましょう。
削除もできるようになっていますね。
どうやらデータベースの移行はうまくいったようです。やることが多くて疲れました (これだけのためにプロジェクト作成からやり直してスクショも撮って)...。
5. まとめ
データベースの移行を行うために様々な設定を行いました。前回、追加機能で Pomelo.EntityFrameworkCore.MySql を導入しました。これは今回の mysql に接続するためのツールで、入っていないとデータベース接続ができなくなります。
ここまで長かったですが、CentOS7を用いてローカルホスト上で文献管理システムを動かすことができました。ここで切ってもいいのですが、せっかくなので dotnet と Apache を使って外部から接続できるように設定していきたいと思います。
お疲れさまでした。