軽量データベース「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を触ったことないよって方は、よかったらこの記事を参考にしてぜひ試してみてください。
コメント