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