Create //playbooks/sqlite3.md
Write a playbook for using SQLite to capture some trivia that I often forget in between my ~infrequent uses of SQLite.
This commit is contained in:
parent
a29ed22a83
commit
6981db2439
1 changed files with 115 additions and 0 deletions
115
playbooks/sqlite3.md
Normal file
115
playbooks/sqlite3.md
Normal file
|
@ -0,0 +1,115 @@
|
|||
# SQLite3
|
||||
|
||||
Creating a reference for SQLite that I can access when I'm offline
|
||||
(e.g. traveling in an airplane).
|
||||
|
||||
## Benefits
|
||||
|
||||
I enjoy using SQLite because it's lightweight and simple. Instead of networking
|
||||
microservices, I can oftentimes just create a simple `db.sqlite3` file and get
|
||||
significant mileage without much tooling overhead.
|
||||
|
||||
## Limitations
|
||||
|
||||
SQLite has some limitations; here are some of the limitations that I have encountered.
|
||||
|
||||
- SQLite **disables** support for `FOREIGN KEY` by default. Enable it with:
|
||||
|
||||
```
|
||||
sqlite> PRAGMA foreign_keys = ON;
|
||||
```
|
||||
|
||||
- SQLite has no `BOOLEAN` type; it uses 0 and 1 instead.
|
||||
|
||||
```
|
||||
sqlite> SELECT TRUE;
|
||||
TRUE
|
||||
----------
|
||||
1
|
||||
sqlite> SELECT FALSE;
|
||||
FALSE
|
||||
----------
|
||||
0
|
||||
```
|
||||
|
||||
- SQLite has no `DATETIME` type; it uses `TEXT` instead.
|
||||
|
||||
```
|
||||
sqlite> SELECT datetime('now');
|
||||
datetime('now')
|
||||
-------------------
|
||||
2020-07-26 09:52:32
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
The following should serve as a useful reference for working with SQLite.
|
||||
|
||||
### Schema
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS Movies (
|
||||
title TEXT NOT NULL,
|
||||
year INTEGER,
|
||||
PRIMARY KEY (title)
|
||||
);
|
||||
|
||||
ALTER TABLE Movies ADD COLUMN rating DEFAULT 0.0;
|
||||
|
||||
DROP TABLE Movies;
|
||||
```
|
||||
|
||||
### Queries
|
||||
|
||||
The following queries should come in handy as a reference:
|
||||
|
||||
```
|
||||
sqlite> -- I'm using an intentionally incorrect date here for the subsequent UPDATE.
|
||||
sqlite> INSERT INTO Movies (title, year) VALUES ('Toy Story 3', 2100);
|
||||
sqlite> SELECT * FROM Movies WHERE year IS NULL;
|
||||
sqlite> UPDATE Movies SET year = 2010 WHERE title = 'Toy Story 3';
|
||||
sqlite> -- % is like .* in a regex
|
||||
sqlite> DELETE FROM Movies WHERE title LIKE 'Toy Story%';
|
||||
```
|
||||
|
||||
## Command Line
|
||||
|
||||
- Create a `~/.sqliterc` file with the following contents:
|
||||
|
||||
```
|
||||
.mode column
|
||||
.headers on
|
||||
```
|
||||
|
||||
- To start an interactive session:
|
||||
|
||||
```shell
|
||||
$ sqlite3 db.sqlite3
|
||||
```
|
||||
|
||||
- To create a SQLite database from a `.sql` file:
|
||||
|
||||
```shell
|
||||
$ sqlite3 db.sqlite3 <db.sql
|
||||
```
|
||||
|
||||
- To reload changes to a `.sql` file while in an interactive session:
|
||||
|
||||
```
|
||||
sqlite> .read db.sql
|
||||
```
|
||||
|
||||
## Miscellaneous
|
||||
|
||||
- For a web-browser-based SQLite viewer, run the following:
|
||||
|
||||
```shell
|
||||
$ sqlite_web db.sqlite3
|
||||
```
|
||||
|
||||
- To import a CSV:
|
||||
|
||||
```
|
||||
sqlite> .mode csv <table-name>
|
||||
sqlite> .import path/to/file.csv <table-name>
|
||||
```
|
Loading…
Reference in a new issue