📄

かんたんDenoでSQLite

2022/02/20に公開

2022/09/19追記:新しく記事を書きました。この記事で書いたソースコードは間違ってはいないのですが新しい記事で紹介したソースコードで書くことをオススメします。

https://zenn.dev/tkithrta/articles/21c681fd14228f


https://deno.land/x/sqlite

DenoでSQLite使うのは非常に簡単で、Windowsで試す場合必要なファイルはdeno.exeランタイムとindex.tsファイルだけでした。
やっていきます。

import { DB } from "https://deno.land/x/sqlite/mod.ts";

const users = ["a", "b", "c"];
const db = new DB("sqlite.db");

db.query("CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT)");
for (const user of users) db.query("INSERT INTO users(user) VALUES(?)", [user]);
for (const user of db.query("SELECT * FROM users")) console.log(user);
db.close();
> dir
...
2022/02/20  17:57    <DIR>          .
2022/02/20  17:57    <DIR>          ..
2021/12/16  18:56        57,516,032 deno.exe
2022/02/20  17:57               389 index.ts
...

> deno run --allow-read --allow-write index.ts
...
[ 1, "a" ]
[ 2, "b" ]
[ 3, "c" ]

簡単ですね。index.tsをウェブサイトにアップロードして読み込めばランタイムだけで動かせます。

$ deno run --allow-read --allow-write https://tkithrta.gitlab.io/u/deno-sqlite-gen.ts

ちなみにtsファイルはアップロードするウェブサイトによってはContent-Typeがapplication/octet-streamやvideo/mp2tになったりして、たまにDeno側でTypeScriptではなくJavaScriptとして解釈されてしまうので注意が必要です。

https://zenn.dev/tkithrta/articles/7ca7ab166bbac8

少し前に紹介したDistrolessコンテナ上でやってみます。

$ docker run -it gcr.io/distroless/cc:debug-nonroot
~ $ wget https://github.com/denoland/deno/releases/download/v1.18.1/deno-x86_64-unknown-linux-gnu.zip
Connecting to github.com (192.30.255.112:443)
Connecting to objects.githubusercontent.com (185.199.108.133:443)
saving to 'deno-x86_64-unknown-linux-gnu.zip'
deno-x86_64-unknown- 100% |**********| 31.4M  0:00:00 ETA
'deno-x86_64-unknown-linux-gnu.zip' saved
~ $ unzip deno-x86_64-unknown-linux-gnu.zip
Archive:  deno-x86_64-unknown-linux-gnu.zip
  inflating: deno
~ $ rm deno-x86_64-unknown-linux-gnu.zip
~ $ ls -lah
total 85M    
drwx------    1 nonroot  nonroot       38 Feb 20 13:40 .
drwxr-xr-x    1 nonroot  nonroot       21 Jan  1  1970 ..
-rw-------    1 nonroot  nonroot      183 Feb 20 13:40 .ash_history
-rwxr-xr-x    1 nonroot  nonroot    84.6M Feb 20 13:40 deno
~ $ ./deno run --allow-read --allow-write https://tkithrta.gitlab.io/u/deno-sqlite-gen.ts
Download https://tkithrta.gitlab.io/u/deno-sqlite-gen.ts
Download https://deno.land/x/sqlite/mod.ts
Warning Implicitly using latest version (v3.2.1) for https://deno.land/x/sqlite/mod.ts
Download https://deno.land/x/sqlite@v3.2.1/mod.ts
Download https://deno.land/x/sqlite@v3.2.1/build/sqlite.js
Download https://deno.land/x/sqlite@v3.2.1/src/constants.ts
Download https://deno.land/x/sqlite@v3.2.1/src/db.ts
Download https://deno.land/x/sqlite@v3.2.1/src/error.ts
Download https://deno.land/x/sqlite@v3.2.1/src/query.ts
Download https://deno.land/x/sqlite@v3.2.1/src/wasm.ts
Download https://deno.land/x/sqlite@v3.2.1/build/vfs.js
Download https://deno.land/x/sqlite@v3.2.1/build/sqlite.d.ts
Check https://tkithrta.gitlab.io/u/deno-sqlite-gen.ts
[ 1, "a" ]
[ 2, "b" ]
[ 3, "c" ]
~ $ ./deno run --allow-read --allow-write https://tkithrta.gitlab.io/u/deno-sqlite-gen.ts
[ 1, "a" ]
[ 2, "b" ]
[ 3, "c" ]
[ 4, "a" ]
[ 5, "b" ]
[ 6, "c" ]
~ $ ./deno run --allow-read --allow-write https://tkithrta.gitlab.io/u/deno-sqlite-gen.ts
[ 1, "a" ]
[ 2, "b" ]
[ 3, "c" ]
[ 4, "a" ]
[ 5, "b" ]
[ 6, "c" ]
[ 7, "a" ]
[ 8, "b" ]
[ 9, "c" ]
~ $ ls -lah
total 85M    
drwx------    1 nonroot  nonroot       69 Feb 20 13:41 .
drwxr-xr-x    1 nonroot  nonroot       21 Jan  1  1970 ..
-rw-------    1 nonroot  nonroot      277 Feb 20 13:41 .ash_history
drwxr-xr-x    3 nonroot  nonroot       18 Feb 20 13:40 .cache
-rwxr-xr-x    1 nonroot  nonroot    84.6M Feb 20 13:40 deno
-rw-r--r--    1 nonroot  nonroot    12.0K Feb 20 13:41 sqlite.db
~ $ ls /usr/sbin
tzconfig
~ $ ls /usr/bin
c_rehash  openssl

プログラミング言語でSQLite扱うのは多分これが一番早いと思います。
お試しあれ。

Discussion