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

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

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')イベントを登録して、クエリが作成された時点でクエリをコンソール表示するようにしておきます。

関連カテゴリー(JavaScript)記事

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