新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

JavaScriptでSQLiteを使う方法メモ

JavaScriptでSQLiteを使う方法メモです。

あまり凝ったことはせず、必要最低限の機能に絞ってまとめました。

SQLiteそのものの使い方は割愛しますが、こちらが詳しいのでご参照ください。

インストール

パッケージ「sqlite3」を使いました。

npm install sqlite3

SQLiteのバイナリーもインストールされるので、SQLiteのインストールは不要なのですが、SQLiteのコマンドラインツールがあると何かと便利なので、別途SQLiteをインストールしておいた方がいいですね。

ドキュメント

パッケージのGithubページに「API documentation」のリンクがあるので、そこで詳しい情報を取得できます。

サンプル

import * as sqlite3 from 'sqlite3';

(async () => {
    try {
        const db = new sqlite3.Database('db.sqlite3');

        db.on('trace', (sql) => {
            console.log(sql);
        });

        await new Promise((resolve, reject)=>{
            db.all(
                `INSERT INTO user_table VALUES(?, ?)`,
                [0, 'TEST'],
                (err, rows)=>{
                    if(err){
                        reject(err);
                    } else {
                        resolve(rows);
                    }
                }
            )
        });

        const rows:Array<any> = await new Promise((resolve, reject)=>{
            db.all(
                `SELECT * FROM user_table`,
                [],
                (err, rows)=>{
                    if(err){
                        reject(err);
                    } else {
                        resolve(rows);
                    }
                }
            )
        });

        rows.forEach((v: any) => console.log(v));

        await new Promise<void>((resolve, reject)=>{
            db.close((err)=>{
                if(err){
                    reject(err);
                } else {
                    resolve();
                }
            });
        });

    } catch (err) {
        console.error(err);
    }
})();

説明

同期実行

追記(2020-01-26)

util.promisify()を使ってPromise化する方法を記載していましたが、Promiseを使う形に修正しました。

クエリ結果はコールバックで呼び出される、非同期スタイルのライブラリです。

同期実行するための関数が用意されているのですが、それは使わず、コールバックをPromise化して、async/awaitを使って同期実行させています。

クエリ実行

クエリを実行する関数はいくつかあるのですが、Database.all()で大抵はまかなえます。

Database.all()は実行結果が配列(rows)で返ってきます。INSERTなど、実行結果の配列を必要としない場合は戻り値を無視します。

1番目の引数にクエリを指定し、2番目の引数にクエリに埋め込む変数値の配列を指定します。すると、クエリの「?」の箇所に、変数値が展開されます。

クエリに直接変数値を書き込むこともできなくはないのですが、埋め込み機能を使えばエスケープ処理もよしなにやってくれるので、絶対に使った方がいいです。

デバッグ

変数を展開した後の実際のクエリを見るには、Database.on('trace')イベントを登録して、クエリが作成された時点でクエリをコンソール表示するようにしておきます。

関連カテゴリー記事

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com