2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BunAdvent Calendar 2023

Day 7

BunでSQLiteをとりあえず触ってみて動いたのでメモ

Last updated at Posted at 2023-11-24

Node.jsが大好きなので、Bunを触り始めたのだけど、新しいだけあってネットを漁っても適切なサンプルコードがほとんど見当たらない。そこで、試行錯誤しながら自分で動かしてみたサンプルをメモしておきます。

今回は、Bunが高性能SQLite3ドライバーをネイティブに実装してるということなので、それを試してみた。BunのSQLiteドキュメントは下記にあります。

Bun>SQLite

インストールなどの話は前回の下記記事など参考にしていただければと思います。
まぁ、ファイル作って実行するだけなので簡単です。
https://qiita.com/toshirot/items/3af83303f95ac7baa546
下記の記事も参考になるかも
Bunかる〜く触ってみた[Bunの実行, nodeとの比較]
https://qiita.com/yusei53/items/7347041cb8fbcfa280cc #Qiita @yuseidayo53より

あとで書き換えますが、最初にだーっと書いてみて動いたコード

sqlite-test1.js
import { Database } from "bun:sqlite";
// データベースファイルの名前を指定
const dbFileName = 'test-1.sqlite';
// テーブルの名前を指定
const tableName = 'dogs';
// 新しいデータベースインスタンスを作成し、ファイルが存在しない場合はデータベースファイルを作成
const db = new Database(dbFileName, { create: true });
// テーブルが存在しない場合はテーブルを作成
const query1 = db.query('CREATE TABLE IF NOT EXISTS ' + tableName + ' (Id INTEGER PRIMARY KEY, Name VARCHAR(255), CreatedAt TIMESTAMP)');
query1.run();
// データをテーブルに挿入 p.s. id重複考慮してないので2件目は++してね
const query2 = db.query('INSERT OR IGNORE INTO ' + tableName + ' VALUES (1, "pochi", CURRENT_TIMESTAMP)');
query2.run();
// テーブルからデータを取得
const query3 = db.query('SELECT * FROM ' + tableName + ';');
query3.run();
// 取得した結果を配列で表示
console.log(query3.values());

実行と結果

#=======================================
#上記 sqlite-test1.js を
bun run sqlite-test1.js
#するとこんな感じで配列が返る。
[
  [ 1, "pochi", "2023-11-23 14:11:50" ], 
  [ 2, "hachi", "2023-11-23 14:17:44" ]
]

db.query()と.run()を関数にまとめてみた

sqlite-test2.js
import { Database } from "bun:sqlite";
// データベースファイルの名前を指定
const dbFileName = 'test-2.sqlite';
// テーブルの名前を指定
const tableName = 'dogs';
// 新しいデータベースインスタンスを作成し、ファイルが存在しない場合はデータベースファイルを作成
const db = new Database(dbFileName, { create: true });
// テーブルが存在しない場合はテーブルを作成
doQuery('CREATE TABLE IF NOT EXISTS ' + tableName + ' (Id INTEGER PRIMARY KEY, Name VARCHAR(255), CreatedAt TIMESTAMP);')
// データをテーブルに挿入 p.s. id重複考慮してないので2件目は++してね
doQuery('INSERT OR IGNORE INTO ' + tableName + ' VALUES (1, "pochi", CURRENT_TIMESTAMP);')
// テーブルからデータを取得
doQuery('SELECT * FROM ' + tableName + ';')

/**
 * データベースクエリを実行する関数
 *
 * @param {string} sql - 実行するSQLクエリ
 * @returns {void}
 */
function doQuery(sql){
    const query = db.query(sql);
    query.run()
    // 取得した結果を配列で表示
    let res=query.values()
    if(res) console.log(res);
}

実行と結果

#=======================================
#上記 sqlite-test2.js を
bun run sqlite-test2.js
#するとこんな感じで配列が返る。
[
  [ 1, "pochi", "2023-11-23 14:11:50" ], 
  [ 2, "hachi", "2023-11-23 14:17:44" ]
]
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?