MYmemo

思い立ってやってみるけど、長続きしない。せめて記録しておく。

TermuxでSQLiteを使ってみる

termuxで何ができるのかな、といじくり回していたときのメモをブログに転記して見た感じです。手間をかけてなくて申し訳ございません。

mymemo8.hatenablog.com


過去MySQLぐらいしか触ったことなかったので、SQLについては初学と言っても良い状態。

じゃあMySQL試せばいいじゃん、と言う向きもありますが、前々から気になっていたので浮気してみました。




SQLiteとは??

RDBMS(relational database management system)の一種だ、とWikipediaで出てくるハズ。RDBMSで私が唯一触ったことがある前述MySQLだとかPostgreSQL、商用のOracle database(勤め先はこれを使っていたハズ)やSQL Server(Microsoft)なんかがある。SQLiteはそれらと一線を画するらしい。

Wikiをそのまま引用すると...

サーバとしてではなくアプリケーションに組み込んで利用されるデータベースである。 一般的なRDBMSと違い、APIは単純にライブラリを呼び出すだけであり、データの保存に単一のファイルのみを使用することが特徴である。

とのこと。ちなみに、私はFenrirFSのファンで今でも使っているのですが、このソフトもSQLiteが組み込まれているよう。(私のようなズボラ人間にとてもオススメのファイル管理ソフトです。)

www.fenrir-inc.com


組込配布できるくらい軽量かつシンプルなところが最大の特徴、であるがゆえに大規模なデータ運用には向かない、という振切った個性あるRDBMSと言えるかと思います。




支障無く普通に使える

勉強がてら軽く動かして見たところ、Termux特有の環境だからこう上手く行かない、みたいな状況にはなりませんでした。

多分、普通に使えるハズ。

なので、これ以上特に考察とか無いので、以下は勉強に操作してみたログ以上の事は何も書いてませんが悪しからず。




Termuxへのインストール

termuxへのインストールはpkgでできる。

$ pkg install sqlite3



対話モードで起動する場合はsqlite3コマンドを実行するだけ。新規DB作成と、作成済DB起動は同じコマンド。ちなみに、拡張子は.dbじゃなくても良い。参考サイトでは.sqlite3を使っているが、拡張子が無くてもちゃんと動作する。後で何のファイルが分からなくなるリスクを考えると.dbが無難だと思う。

$ sqlite3 ○○.db  


尚、コマンド入力に失敗した場合はCtrl + dで強制終了。もしくは;を入力すると解除される。




Tableを作ってみる

言わずもがな、DBはテーブルそのものではない。MicrosoftExcelに例えると、DBがExcelファイルに相当し、テーブルがExcelファイルに収録された個々のシートのイメージかと。

ここでは、Arsenalの選手に関するTableを作ってみます。

$ create table arsenal(id, name);  
$ insert into arsenal values(1, 'Ben White');


結果、以下のようなTableが出来上がる。

id name
1 Ben White

実際にTableが生成できているかどうかについては.tablesを実行して確認できる。

$ .tables
arsenal


arsenalテーブル内にレコードが生成されているかどうかについては以下を実行すれば良い。arsenalのところを対象テーブル名に置き換えて実行。

$ select * from arsenal;


実行結果でヘッダーが表示されない場合は.headersを切り替える。onは表示でoffが非表示。

$ .headers on


ちなみに、文字列をinsertする際、文字列をシングルクオーテーションで囲う必要がある。Markdownを頻繁につかってるので思わずバッククオートで囲ってしまうと、もちろんエラーになる。しかもエラーメッセージが一見何を言ってるかわからんから、ちょっとハマってしまった。なんのことはない。

Parse error: no such column: Ben White


余談ですが、一瞬エラーの原因がデータの型の問題かと思いました。コレを確かめるには以下を実行すればデータ型が何か判別できる。

$ select name, typeof(name) from arsenal;  
name|typeof(name)
Ben White|text




値の変更はupdate

例えば前述のテーブルでBen Whiteのidを彼の(2023年時点の)背番号「4」に変えたいとする。今回特に何も考えずにテーブルを作ったが、このような場合、各レコードの値を一意に識別できるID「ROWID」が勝手に生成されている。ROWIDはレコード生成順に1番から作られているハズ。確かめるためには以下を実行すると良い。

$ select ROWID, * from arsenal;
ROWID id name
1 1 Ben White


なるほど、これなら「id」を背番号に変えても問題無い。Ben Whiteのidは4に変更しよう。

$ update arsenal set date=4 where rowid=1;
ROWID id name
1 4 Ben White




カラムの追加・削除はAlter

選手の国籍を入れるカラムを追加してみたい。基本構文はALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;

$ alter table arsenal add column Nat. text;
$ update arsenal set Nat.=’ENG’ where rowid=1;
id name Nat.
4 Ben White ENG


ちなみにupdateする際にwhereで条件指定しているが、これをしないと全てのレコードが上書きされてしまうので要注意

カラムを削除したい場合は以下の通り、dropする。

$ alter table arsenal drop column Nat.;



ここまで来ると、こんなこと思わないでしょうか?カラム名「ID」を「背番号」にしたいな~なんて。そして気が付きます。実はカラム名は変更出来ない…。ついでに言うとカラムは順次変更も出来ない。追加はできるが末尾にのみ追加できるだけ、と融通が効かない。どうしてもそうしたい場合、テーブル自体を作り直すか、一旦カラムを消して再度追加するか。

他のSQL、例えばMysqlなどはカラム名の変更も可能なので、これはSQLiteのイケてないところかも。




データの取得はSelect

基本構文は以下の通り
select 対象カラム from テーブル where 抽出条件

select文を試すためにテーブルを拡張します。もはや趣味の世界。

id name Nat. pos.
4 Ben White ENG DF
1 Ramsdale ENG GK
12 Saliba FRA DF

テーブル全体を取得する方法は前述の通り

$ select * from arsenal;


もちろん、指定カラムのみの取得も可能。

$ select name, Nat. from arsenal;  
name Nat.
Ben White ENG
Ramsdale ENG
Saliba FRA


さらに抽出条件を指定する。ナショナルがイングランドのみで取得するなら以下。

$ select name, Nat. from arsenal where Nat.='ENG';  
name Nat.
Ben White ENG
Ramsdale ENG




参考文献・メモ

このサイトが私の教科書です。凄いまとまってる。 SQLite入門 | Let'sプログラミング

備忘録 command|note :---|:--- .databases|接続中データベース情報表示 .help|コマンド一覧 .headers|on offでheader表示切替 .exit / .quit|SQLiteの終了 .tables|データベース内のテーブル名表示