【C#】SQLiteとC#が使える開発環境を作ろう!

技術

軽量データベース「SQLite」を使ってみよう

SQLiteはオープンソースの軽量なデータベースとして有名ですが、実は使ったことがありませんでした。
SQLiteに高いハードルがあるわけではなく、単に触る機会がなかったってだけの話ですが。

で、近いうちに個人的に作ろうと思っているアプリケーションにDBが必要になったのですが、PostgreSQLやMySQLのような大掛かりなDBは必要ないって感じ。

ということで1ファイルで完結する SQLite がちょうどいいかなというところで、今回はC#とSQLiteで開発ができる環境を作ってみようと思います。

SQLiteの環境づくりって本当に必要なの?

C#とSQLiteの環境を作るとはいっても、すでに書いた通りSQLiteはサーバープログラムを必要としない1ファイルで完結するデータベースです。

なので実際にC#から扱おうとするだけであれば、特に何かをインストールする必要はなく、SQLiteを扱うライブラリをNugetから落としてくるだけです。

例えば下記のコマンドでDockerコンテナを作って試してみます。

docker run -itd --name sqlite_sample mcr.microsoft.com/dotnet/sdk:7.0

C#のフレームワークには、少し前に正式リリースされたばかりの.NET7を選んでみました。

出来上がったsqlite_sampleコンテナにVSCodeのRemoteDevelopment拡張で接続します。

接続できたら任意のディレクトリで「dotnet new」してプロジェクトを作ってみます。
(ここでは「/usr/src」ディレクトリで試してみました)

cd /usr/src
dotnet new console --name sqlite_sample

続けてNugetからSQLiteのライブラリを参照追加します。

cd /usr/src/sqlite_sample
dotnet add package Microsoft.Data.Sqlite

これで C# からSQLiteを扱う準備はできました。
早速試してみましょう。

Program.csを下記のように編集します。

using Microsoft.Data.Sqlite;

using (var connection = new SqliteConnection("Data Source=/usr/src/database.db"))
{
    connection.Open();
    // テーブル作成
    var command = connection.CreateCommand();
    command.CommandText = "CREATE TABLE IF NOT EXISTS SAMPLE_TABLE (id int, name text)";
    command.ExecuteNonQuery();
    // データ追加
    Console.WriteLine("【INSERT】");
    command.CommandText = "INSERT INTO SAMPLE_TABLE (id, name) VALUES (1, '山田'), (2, '伊藤')";
    command.ExecuteNonQuery();
    command.CommandText = "SELECT * FROM SAMPLE_TABLE";
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            var id = reader.GetInt32(0);
            var name = reader.GetString(1);
            Console.WriteLine($"({id}, {name})");
        }
    }
    // データ更新
    Console.WriteLine("【UPDATE】");
    command.CommandText = "UPDATE SAMPLE_TABLE SET name = '鈴木' WHERE id = 1";
    command.ExecuteNonQuery();
    command.CommandText = "SELECT * FROM SAMPLE_TABLE";
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            var id = reader.GetInt32(0);
            var name = reader.GetString(1);
            Console.WriteLine($"({id}, {name})");
        }
    }
    // データ削除
    Console.WriteLine("【DELETE】");
    command.CommandText = "DELETE FROM SAMPLE_TABLE WHERE id = 1";
    command.ExecuteNonQuery();
    command.CommandText = "SELECT * FROM SAMPLE_TABLE";
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            var id = reader.GetInt32(0);
            var name = reader.GetString(1);
            Console.WriteLine($"({id}, {name})");
        }
    }
    // 残っているデータを全部消しておく
    command.CommandText = "DELETE FROM SAMPLE_TABLE";
    command.ExecuteNonQuery();
}

実行してみればちゃんと「/usr/src/database.db」が作られて、テーブル作成からINSERT/UPDATE/DELETE/SELECTまで正常に実行できていることが確認できると思います。

dotnet run
<<実行結果>>

ちなみに「database.db」ファイルを事前に用意しておかないということはなくて、dbファイルがなければconnection.Open()した時点で勝手に生成されます。

それでもSQLite開発環境を作りたい

確かにC#からSQLiteを扱うだけなら、わざわざ「環境づくり」なんて必要なさそうです。
ただ、やはりテーブルの内容をVSCode上で確認できた方が便利だろうと思います。

ということで SQLite用のVSCode拡張をsqlite_sampleコンテナにインストールすることにしました。

ところが、残念ながらこの拡張機能はこれだけでは動きません。

sqlite_sampleコンテナはmcr.microsoft.com/dotnet/sdk:7.0をベースイメージとしていますが、このDockerイメージはLinuxのDebianディストリビューションになっています。

VSCode拡張のページの「Overview」にも書いてある通り、LinuxでこのVSCode拡張が動くためにはsqlite3(https://www.sqlite.org)というコマンドラインツールが必要らしいです。

ということで早速sqlite3をインストールしましょう。
sqlite3はこのコマンドでインストールできます。

apt update
apt install sqlite3 -y

つづいて SQLite用のVSCode拡張 をインストールします。

コマンドツールとVSCode拡張がどちらもインストールできたらVSCodeのEXPLORER上で「database.db」を右クリックします。
右クリックのメニューの中から「Open Database」選ぶとSQL EXPLORERにdatabase.dbが追加されて、登録されているテーブルが確認できます。

テーブルの内容を確認したい場合はSQL EXPLORERでテーブルを右クリックして、メニューの中から「Show Table」をすると確認できます。

このVSCode拡張ではデータをGUIで編集することはできないので、INSERTやUPDATEのSQLを使う必要があります。
SQL EXPLORERの右クリックメニューから「New Query」を選んで、開いたエディタにSQLを記述して実行すればOKです。

まとめ

ということで、今回はSQLiteとC#の開発環境を作ってみました。
SQLiteはシンプルにデータを蓄積するだけという目的で気軽に使えるDBで、例えばモック開発なんかに使いやすいと思います。

開発環境を用意するのにもほとんど手間いらず、といった感じなので、非常に使い勝手がいいです。

ただし、ファイルベースの軽量なDBという特性上、SQLiteには他のDBには存在する機能が存在しないことがあります。

例えば、SQLiteにはユーザーという概念が存在しないので、当然権限みたいなものもDBの機能としてはありません。
あるいは、テーブル単位や行単位のロックというものはなく、ロック制御はDB全体にかけることしかできなど。

それでも、使いどころを間違えなければとても便利なデータベースなので、これからは積極的に使っていきたいと思いました。

まだSQLiteを触ったことないよって方は、よかったらこの記事を参考にしてぜひ試してみてください。

コメント

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