いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

SQLite3 をコマンドラインで利用する場合に設定しておいた方が良いもの

概要

以下、自分用のメモです。最近よく忘れることが多いのでここにメモメモ。。。

SQLite3をコマンドラインで利用する場合に最低限以下を設定しておくと少し見やすくなります。

どれも基本的なものですが、忘れちゃうんですよね・・・年食うと。

  • .headers on
  • .mode column
  • .nullvalue [NULL]

試してみる

こんな感じのテーブル定義と初期データがあるとして

init.sql

CREATE TABLE Departments (
    DepartmentID INTEGER PRIMARY KEY,
    DepartmentName TEXT NOT NULL
);

CREATE TABLE Employees (
    EmployeeID INTEGER PRIMARY KEY,
    FirstName TEXT NOT NULL,
    LastName TEXT NOT NULL,
    DepartmentID INTEGER REFERENCES Departments(DepartmentID),
    HireDate TEXT NOT NULL
);

CREATE TABLE Projects (
    ProjectID INTEGER PRIMARY KEY,
    ProjectName TEXT NOT NULL,
    StartDate TEXT NOT NULL,
    EndDate TEXT,
    DepartmentID INTEGER REFERENCES Departments(DepartmentID)
);

CREATE TABLE Tasks (
    TaskID INTEGER PRIMARY KEY,
    TaskName TEXT NOT NULL,
    StartDate TEXT NOT NULL,
    EndDate TEXT,
    ProjectID INTEGER REFERENCES Projects(ProjectID),
    EmployeeID INTEGER REFERENCES Employees(EmployeeID)
);

INSERT INTO Departments (DepartmentID, DepartmentName) VALUES
(1, 'IT'),
(2, 'HR'),
(3, 'Finance');

INSERT INTO Employees (EmployeeID, FirstName, LastName, DepartmentID, HireDate) VALUES
(1, 'Taro', 'Yamada', 1, '2020-01-01'),
(2, 'Hanako', 'Suzuki', 1, '2020-01-15'),
(3, 'Ichiro', 'Tanaka', 2, '2020-02-01'),
(4, 'Yoko', 'Watanabe', 3, '2020-02-15');

INSERT INTO Projects (ProjectID, ProjectName, StartDate, EndDate, DepartmentID) VALUES
(1, 'System Upgrade', '2022-01-01', '2022-06-30', 1),
(2, 'Recruitment Campaign', '2022-01-01', '2022-12-31', 2),
(3, 'Budget Planning', '2022-04-01', '2022-09-30', 3);

INSERT INTO Tasks (TaskID, TaskName, StartDate, EndDate, ProjectID, EmployeeID) VALUES
(1, 'Server Maintenance', '2022-01-01', '2022-01-15', 1, 1),
(2, 'Database Migration', '2022-01-15', '2022-03-15', 1, 2),
(3, 'Interview Scheduling', '2022-02-01', '2022-02-28', 2, 3),
(4, 'Resume Screening', '2022-01-15', '2022-03-15', 2, 3),
(5, 'Financial Forecast', '2022-04-01', '2022-05-31', 3, 4),
(6, 'Expense Analysis', '2022-06-01', '2022-09-30', 3, 4);

PRAGMA foreign_keys = ON;

これを食べさせて、データベースを作成

$ sqlite3 my.db < init.sql

んで、コマンドラインから操作してみましょう。

$ sqlite3 my.db
SQLite version 3.41.2 2023-03-22 11:56:21
Enter ".help" for usage hints.

sqlite> .version
SQLite 3.41.2 2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da
zlib version 1.2.13
gcc-11.3.0

sqlite> .tables
Departments  Employees    Projects     Tasks

sqlite> .schema tasks
CREATE TABLE Tasks (
    TaskID INTEGER PRIMARY KEY,
    TaskName TEXT NOT NULL,
    StartDate TEXT NOT NULL,
    EndDate TEXT,
    ProjectID INTEGER REFERENCES Projects(ProjectID),
    EmployeeID INTEGER REFERENCES Employees(EmployeeID)
);

オケ。で、Tasksテーブルのデータを見てみます。

sqlite> SELECT * FROM Tasks;
1|Server Maintenance|2022-01-01|2022-01-15|1|1
2|Database Migration|2022-01-15|2022-03-15|1|2
3|Interview Scheduling|2022-02-01|2022-02-28|2|3
4|Resume Screening|2022-01-15|2022-03-15|2|3
5|Financial Forecast|2022-04-01|2022-05-31|3|4
6|Expense Analysis|2022-06-01|2022-09-30|3|4

なんか、うーんって感じの出力になります。ヘッダも無いし・・。

.headers on

てことで、以下でヘッダを表示するように指示します。

sqlite> .headers on

で、再度同じクエリを発行。

sqlite> SELECT * FROM Tasks;
TaskID|TaskName|StartDate|EndDate|ProjectID|EmployeeID
1|Server Maintenance|2022-01-01|2022-01-15|1|1
2|Database Migration|2022-01-15|2022-03-15|1|2
3|Interview Scheduling|2022-02-01|2022-02-28|2|3
4|Resume Screening|2022-01-15|2022-03-15|2|3
5|Financial Forecast|2022-04-01|2022-05-31|3|4
6|Expense Analysis|2022-06-01|2022-09-30|3|4

ヘッダーが表示されるようになりました。でも、まだ見やすくない・・・。なんか、ギチギチな感じ。

.mode column

なので、いい感じに表示してもらうように以下を設定。

sqlite> .mode column

再度、クエリを発行。

sqlite> SELECT * FROM Tasks;
TaskID  TaskName              StartDate   EndDate     ProjectID  EmployeeID
------  --------------------  ----------  ----------  ---------  ----------
1       Server Maintenance    2022-01-01  2022-01-15  1          1         
2       Database Migration    2022-01-15  2022-03-15  1          2         
3       Interview Scheduling  2022-02-01  2022-02-28  2          3         
4       Resume Screening      2022-01-15  2022-03-15  2          3         
5       Financial Forecast    2022-04-01  2022-05-31  3          4         
6       Expense Analysis      2022-06-01  2022-09-30  3          4

いい感じになりました。

で、おもむろに以下のレコードをINSERTしてみます。

sqlite> INSERT INTO Tasks (TaskID, TaskName, StartDate) VALUES (99, 'TEST', date('now'));

で、クエリを発行。

sqlite> SELECT * FROM Tasks;
TaskID  TaskName              StartDate   EndDate     ProjectID  EmployeeID
------  --------------------  ----------  ----------  ---------  ----------
1       Server Maintenance    2022-01-01  2022-01-15  1          1         
2       Database Migration    2022-01-15  2022-03-15  1          2         
3       Interview Scheduling  2022-02-01  2022-02-28  2          3         
4       Resume Screening      2022-01-15  2022-03-15  2          3         
5       Financial Forecast    2022-04-01  2022-05-31  3          4         
6       Expense Analysis      2022-06-01  2022-09-30  3          4         
99      TEST                  2023-05-01                                   

NULLか空白とかなのか、見分けが付きません。。

.nullvalue [NULL]

なので、以下を設定します。

sqlite> .nullvalue [NULL]

で、クエリを発行。

sqlite> SELECT * FROM Tasks;
TaskID  TaskName              StartDate   EndDate     ProjectID  EmployeeID
------  --------------------  ----------  ----------  ---------  ----------
1       Server Maintenance    2022-01-01  2022-01-15  1          1         
2       Database Migration    2022-01-15  2022-03-15  1          2         
3       Interview Scheduling  2022-02-01  2022-02-28  2          3         
4       Resume Screening      2022-01-15  2022-03-15  2          3         
5       Financial Forecast    2022-04-01  2022-05-31  3          4         
6       Expense Analysis      2022-06-01  2022-09-30  3          4         
99      TEST                  2023-05-01  [NULL]      [NULL]     [NULL]

うん。いい感じ。

参考情報

dba.stackexchange.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。