Webアプリ SQLiteをMySQLに変更する

プログラミング

データベースをSQLiteで開発してきましたが、本番環境で使用するデータベースはMySQLになります。
開発環境と本番環境のデータベースの種類が異なると、デプロイに問題が生じるため、開発環境をMySQLに変更する必要がでてきました。

今回SQLiteをMySQLに変更をしましたので、変更手順を記録として残しておきたいと思います。

なお、今回の記事は、既にMySQLをインストール済みであること、データベースとテーブルを作成済みであることを前提としています。
MySQLのインストール、データベースとテーブルの作成は別記事で紹介します。

変更手順は

  • Pomelo.EntityFrameworkCore.MySqlをインストール
  • program.csの書き換え
  • appsetting.jsonの書き換え

program.csの書き換えは、データベース接続情報を直接program.cs内に書き込む方法とappsetting.jsonから取得する方法の二通りについて紹介します。

Entity Framework Core データベースプロバイダーのインストール

Entity Framework CoreでMySQLを使うために、Pomelo.EntityFrameworkCore.MySqlをインストールします。
SQLiteは別途プロバイダーをインストールしなくても使用できますが、MySQLはインストールが必要です。
なお、Pomelo.EntityFrameworkCore.MySqlの他にも提供されているデータベースプロバイダー(たとえばOracleから提供されているものなど)があるそうですが、これが一番人気があるそうです。

1.プロジェクト名を右クリックして「NuGetパッケージの管理」をクリックします。

2.Pomelo.EntityFrameworkCore.MySqlをインストールします。

Program.csの書き換え program.csに直接データベース接続情報を記述

SQLite(SQLServer)データベースへの接続記述をMySQLの接続記述に書き換えます。

ここでは、データベース接続情報をprogram.csの中に直接記述するコードを紹介します。
この方法は、データベース接続情報の取得にappsetting.jsonを使わないため、appsetting.jsonにデータベース接続情報を記述する必要はありません。

青字の部分のusingを追加します。

using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
using Pomelo.EntityFrameworkCore.MySql.Internal;

Pomelo.EntityFrameworkCore.MySql.Infrastructureは、Entity Framework CoreでMySQLを使用するための必要なMySQLサーバーとの通信、データベース接続、トランザクション管理、クエリの生成、データベーススキーマのマッピングなどの根幹となる機能(インフラストラクチャ)が含まれています。
Pomelo.EntityFrameworkCore.MySql.Internalにはインフラストラクチャで使用される内部クラスが含まれています。

どちらも、Entity Framework CoreでMySQLを使用するために必要となります。
また、この2つのusingは、データベース接続情報をappsetting.jsonから取得する場合も必要です。

下記のコードは、MySQLデータベースへの接続情報をプログラムに直接記述しています。

string connectionString = Server=localhost;Database=BGC;User=root;Password=password“;
var serverversion = new MySqlServerVersion(new Version(8, 0, 30));
builder.Services.AddDbContext<BGCContext>(
    DbContextOptions => DbContextOptions
    .UseMySql(connectionString, serverversion)
    .LogTo(Console.WriteLine, LogLevel.Information)
    .EnableSensitiveDataLogging()
    .EnableDetailedErrors()
    );

【コードの解説】
Server=localhost;Database=BGC;User=root;Password=passwordについて
MySqlのデータベース接続情報です。
BGCがデータベース名、UserとPasswordは、今回rootを指定しています。
本来ならrootは指定しないで、データベースに開発者用のユーザー名とパソワードを作成し、それを指定すべきでしょうが、今回は私一人で開発しているのでrootを指定しました。

new MySqlServerVersion(new Version(8, 0, 30))について
MySqlのバージョンを指定します。(8,0,30)
MySqlのコマンド画面から次のコマンドを打ち込むとバージョンを確認できます。

mysql> select version();
+———–+
| version() |
+———–+
| 8.0.30    |   ←この番号を8,0,30のようにカンマ(,)で区切って指定します
+———–+

AddDbContextメソッドを使用して、BGCContextクラスをDIコンテナに登録し、UseMySqlメソッドを使用して、MySQLデータベースに接続するための接続文字列を指定しています。
LogToメソッドを使用して、ログ出力を有効にしています。
EnableSensitiveDataLoggingメソッドを使用して、機密情報を含むクエリのログ出力を有効にしています。
EnableDetailedErrorsメソッドを使用して、詳細なエラー情報をログ出力を有効にしています。

ちなみに、変更前のコードは下記のように記述していました。
このコードは、SQLServer(SQLite)のデータベース接続情報をappsetting.jsonから取得するコードです。

builder.Services.AddDbContext<BGCContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString(“BGCContext”) ?? throw new InvalidOperationException(“Connection string ‘BGCContext’ not found.”)));

Program.csの全コード(program.csコードにデータベース接続情報を記述)
 
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
using Pomelo.EntityFrameworkCore.MySql.Internal;

using BGC.Data;
 
var builder = WebApplication.CreateBuilder(args);
 
// Add services to the container.
builder.Services.AddRazorPages();
 
string connectionString = “Server=localhost;Database=BGC;User=root;Password= password “;
var serverversion = new MySqlServerVersion(new Version(8, 0, 30));
builder.Services.AddDbContext<BGCContext>(
    DbContextOptions => DbContextOptions
    .UseMySql(connectionString, serverversion)
    .LogTo(Console.WriteLine, LogLevel.Information)
    .EnableSensitiveDataLogging()
    .EnableDetailedErrors()
    );

 
var app = builder.Build();
 
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler(“/Error”);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
 
app.UseHttpsRedirection();
app.UseStaticFiles();
 
app.UseRouting();
 
app.UseAuthorization();
 
app.MapRazorPages();
 
app.Run();

Program.csの書き換え データベース接続情報をappsetting.jsonから取得

青字の部分のusingを追加します。
program.csコードにデータベース接続情報を記述するときのコードと同じです。

using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
using Pomelo.EntityFrameworkCore.MySql.Internal;

下記のコードは、appsetting.jsonからMySQLデータベースの接続情報を取得しています。
データベース接続情報は、あらかじめappsetting.jsonに設定しておく必要があります。

builder.Services.AddDbContext<BGCContext>(
    (serviceProvider, optionsBuilder) => {
        var configuration = serviceProvider.GetRequiredService<IConfiguration>();
        var connectionString = configuration.GetConnectionString(“BGCContext”);
        var serverversion = new MySqlServerVersion(new Version(8, 0, 30));
        optionsBuilder.UseMySql(connectionString, serverversion)
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging()
            .EnableDetailedErrors();
    }
);

【コードの解説】
AddDbContextメソッドの第二引数にラムダ式を渡し、その中でIConfigurationを使ってappsettings.jsonから接続文字列を取得するようにします。
また、DbContextOptionsをoptionsBuilderに変更して、UseMySqlメソッドの引数に接続文字列とサーバーバージョンを渡すようにします。以上の変更で、appsettings.jsonから接続情報を取得することができます。

ちなみに、変更前のコードは下記のように記述していました。
このコードは、SQLServer(SQLite)のデータベース接続情報をappsetting.jsonから取得するコードです。

builder.Services.AddDbContext<BGCContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString(“BGCContext”) ?? throw new InvalidOperationException(“Connection string ‘BGCContext’ not found.”)));

Program.csの全コード(appsetting.jsonにデータベース接続情報を記述)
 
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
using Pomelo.EntityFrameworkCore.MySql.Internal;

using BGC.Data;
 
var builder = WebApplication.CreateBuilder(args);
 
// Add services to the container.
builder.Services.AddRazorPages();
 
builder.Services.AddDbContext<BGCContext>(
    (serviceProvider, optionsBuilder) =>
    {
        var configuration = serviceProvider.GetRequiredService<IConfiguration>();
        var connectionString = configuration.GetConnectionString(“BGCContext”);
        var serverversion = new MySqlServerVersion(new Version(8, 0, 30));
        optionsBuilder.UseMySql(connectionString, serverversion)
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging()
            .EnableDetailedErrors();
    }
);

 
var app = builder.Build();
 
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler(“/Error”);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
 
app.UseHttpsRedirection();
app.UseStaticFiles();
 
app.UseRouting();
 
app.UseAuthorization();
 
app.MapRazorPages();
 
app.Run();

appsetting.json データベース接続情報を記述

青字の部分がデータベース接続情報です。

Program.csにデータベース接続情報を直接記述しないで、appsetting.jsonから取得する場合に必要です。

{
  “Logging”: {
    “LogLevel”: {
      “Default”: “Information”,
      “Microsoft.AspNetCore”: “Warning”
    },
  },
    “AllowedHosts”: “*”,
    “ConnectionStrings”: {
      “BGCContext”: “Server=localhost;Database=BGC;UserId=root;Password=password”
    }

  }

ちなみに、変更前のコードは下記のように記述していました。
このコードは、SQLServer(SQLite)のデータベース接続情報です。

    “AllowedHosts”: “*”,
      “ConnectionStrings”: {
      “BGCContext”: “Server=(localdb)\\mssqllocaldb;Database=BGCContext-6aebee35-bede-442a-896a-efcfa237861e;Trusted_Connection=True;MultipleActiveResultSets=true”
    }

デバッグで起動し、血糖値管理アプリが使えることを確認しました。
血糖値測定データを登録画面から登録し、MySQLのコマンドラインで
SELECT * FROM VALUE;
と入力すると、登録したデータが表示されました。
無事、MySQLへの変更ができました。

今回は、プロジェクトのデータベースをSQLiteにしたため、紹介したようなMySQLへの変更作業をすることになりました。
プロジェクト作成時にMySQLにしておけば、このような手間はかかりません。
勉強のためと思い、軽い気持ちでSQLiteにしてしまいましたが、データベースはシステムの根幹になるので、このような変更は好ましくありません。

まあ、勉強になったので、良しとしましょう。

それから、作業の最後にUpdate-Databaseコマンドでデータベースの更新をしなければいけないと思っていましたが、しなくても良いようです。

タイトルとURLをコピーしました