Open1

Denoでsqlite(WASM)にアクセス

MasatMasat

denoでDatabaseにアクセスする方法を調べてみた。
ORM経由より直接SQLを実行するほうが好みのスタイル。マニュアルは以下の通り。

https://deno.land/manual@v1.30.3/basics/connecting_to_databases

少しだけサンプルを解説するとコードを動かしてDBをNewするとtest.dbがカレントディレクトリに作成される。勉強不足かもしれないがWASMってセキュリティ関連で、その場限りと思い込んでいた(サンドボックス内で動作するので外のファイルアクセス不可と思っていた)ライブラリ内部で何かやっているのかもしれないがすごく便利だと思う。(ローカルのdenoのCLIで動かしているので例えばdeno deploy上で動かすと動きが変わったりしないか?)

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

// Open a database
// ここでカレントディレクトリにtest.dbが作成される。
const db = new DB("test.db");
db.execute(`
  CREATE TABLE IF NOT EXISTS people (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
  )
`);

// Run a simple query
for (const name of ["Peter Parker", "Clark Kent", "Bruce Wayne"]) {
  db.query("INSERT INTO people (name) VALUES (?)", [name]);
}

// Print out data in table
for (const [name] of db.query("SELECT name FROM people")) {
  console.log(name);
}

// Close connection
db.close();

DBのclose後もデータが残っているし、なんならdenoの終了後、再実行してもデータアクセスできる

//再度オープン
> const db = new DB("test.db");
undefined
> // Print out data in table
for (const [name] of db.query("SELECT name FROM people")) {
  console.log(name);
}
//普通に前のデータが表示
Peter Parker
Clark Kent
Bruce Wayne
undefined
>

当たり前だが、外部からアクセスもできる

~> sqlite3 test.db
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
sqlite> SELECT * FROM people;
1|Peter Parker
2|Clark Kent
3|Bruce Wayne
sqlite>