Node.jsからSQLiteを操作する方法
sqlite3を使うとNode.jsからSQLiteを操作できます。
バージョン
- sqlite3 - 5.0.10
インストール
使用方法
パラメータ渡しの例
パラメータ数と配列の要素数を同じにします。パラメータ無しの場合は[]
を指定、または省略できます。
SELECT処理
SELECTには次の3つのメソッドが利用できます。
db.get()
- 抽出結果の先頭1行のみを返しますrow
には行データが格納されます。該当データなしの場合はundefined
です。db.all()
- 全ての抽出結果を返しますrows
には行データが配列形式で格納されます。該当データなしの場合は空配列([]
)になります。db.each()
- 抽出結果を順次コールバックで通知しますコールバックが該当データ分実行されます。該当データなしの場合はコールバックが実行されません。
INSERT処理など
db.run()
で非同期にSQL文を実行できます。
発行したSQL文を順番に実行したい場合はdb.serialize()
メソッドを使います。
prepare()メソッド
複数データの登録を行う場合は、db.prepare()
メソッドが利用できます。
nexeでexe化したときに次のエラーが出る場合の対処方法
nexeを使ってNode.jsプロジェクトをexe化して実行すると、次のようなエラーが発生しました。その時の対処方法。
Node v14
Node v12
対処方法
- \node_modules\sqlite3\lib\binding\napi-v6-win32-unknown-x64ディレクトリをカレントディレクトリにコピーする
- \node_modules\sqlite3\package.jsonの次の箇所を書き換える
- 変更前
- 変更後
実行時の構成
ディレクトリ内のnode_sqlite3.nodeのみをカレントディレクトリにコピーしてパスを指定してもうまく動かないのでディレクトリごとコピーします。
Promise で返す方法
結果をpromiseで返却するサンプルです。selectHistoriesAsync()
メソッド呼び出し側はawaitで結果を待つことができます。
Error: SQLITE_MISUSE: Database handle is closed の対処方法
クエリ(SQL文)実行結果のコールバック内で更に別のクエリを実行時に次のようなエラーが発生することがあります。
これはdb.close()
が先に動作するためです。
db.close()
以前に発行済みのクエリは実行されてからデータベースのクローズが行われますが、コールバック内のクエリは未だ発行されていないためエラーが発生します。
これを回避するためには、コールバック内のクエリを実行してから、db.close()
をコールするようにします。