SQLite のデータベースファイルへのアクセスは NW.js 自体にはモジュールが用意されていないため、node-sqlite3 という Node.js のモジュールを別途追加する必要があります。ただ NW.js のバージョンによってサポートされていないという情報もあり、(実際に最新版である 0.11.0 では動作しませんでした。)今回は node-webkit 0.10.5 (NW.js の旧バージョン)を使用致しました。
また node-sqlite3 を使用せずに、sql.js というピュア JavaScript のライブラリで SQLite を扱う方法もあります。こちらの方が導入がいたってシンプルです。詳細についてはこちらを参照してください。
node-sqlite3 の導入
[Mac の場合]
- terminal を起動
- node をインストール
brew install node
- app/node_modules に移動 (node_modules フォルダがない場合は作成)
cd app/node_modules - npm (Node.js Package Manager)にてsqlite3 のモジュールをインストール
npm install sqlite3
- node-gyp (Generate Your Projects の略) をインストール
npm install -g node-gyp - nw-gyp rebuild –target=0.5.0
- node-pre-gyp (Node.js native addon binary install tool) をインストール
- node-webkit のバージョンを指定する
npm install node-pre-gyp -g - sqlite3 のモジュールをリビルド
node-pre-gyp rebuild –runtime=node-webkit –target=0.10.5 –target_arch=x64
- アプリを起動
nw=”/Applications/node-webkit.app/Contents/MacOS/node-webkit”
nw app
- node-sqlite3
- node-pre-gyp (Node.js native addon binary install tool)
- Build native modules with nw gyp
トラブルシューティング
NW.js のバージョンが11以降の場合、ビルド時にエラーが発生する場合あります。その場合 0.10.x でビルドするとうまくいく場合があります。
https://github.com/mapbox/node-sqlite3/issues/366
ビルド時に以下の様なエラーが発生した場合、コンパイラが正しく設定されていない可能性があります。
以下の方法でコンパイラを設定
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
Windows の場合、ビルド時に以下の様な「Microsoft.Cpp.Default.propsが見つからない」という趣旨のエラーが発生することがあります。これはビルドに使用するコンパイラが正しく設定されていない場合に発生すると思われます。
その場合、まず Visual Studio がインストールされているか確認して下さい。それでもエラーが発生する場合、以下のコマンドで改善される場合があります。
npm install contextify –msvs_version=2012
利用例
var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database('mydb.db'); db.serialize(function() { db.each( "SELECT filed_name1, filed_name2 " + " FROM table_name”, function(err, row) { console.log(row.filed_name1 + ": " + row.filed_name2); } ); }); db.close();
sql.js の導入
node-sqlite3 は導入時にいろいろとトラブルも多く、最新版のNW.jsでは動作しませんでした。またネイティヴのモジュールを必要とするため、マルチプラットフォームでの配布や実行時にトラブルが発生しないか不安が残ります。このためより手軽に SQLite を利用したい場合には、sql.js という JavaScript のライブラリが大きな選択肢になるかと思います。ダウンロードした sql.js ファイルをインクルードするだけで利用可能で、試しに既存の SQLite のデータベースファイルを読み込んでみましたが、日本語も問題なく読み書きできました。これまでのところ大きなトラブルも確認できておりませんが、唯一のデメリットはライブラリのファイルサイズが約1.5MBと、かなり大きいことです。
利用例
<!DOCTYPE html> <html> <head> <title>SQLite test</title> <script type='text/javascript' src='./sql.js'></script> <script type="text/javascript"> function file_ChangeHandler(element) { var file = element.files[0]; var fileReader = new FileReader(); fileReader.onload = function() { var Uints = new Uint8Array(fileReader.result); db = new SQL.Database(Uints); if(db) { var result = db.exec( "SELECT field_name1, field_name2 " + " FROM table_name " ); var rows = result[0]["values"]; for (var i=0; i<rows.length; i++) { console.log( rows[i][0] ); // filed 1 value console.log( rows[i][1] ); // filed 2 value } } } fileReader.readAsArrayBuffer(file); } </script> </head> <body> <input type="file" id="file" accept=".db" onchange="file_ChangeHandler(this)"> </body> </html>