nodejsインテグレーションsqlite

8134 ワード

nodeの上にある軽量級の組み込みデータベースを探しています.組み込みデータベースの代表として、sqliteはきっと理想的な選択案です.npmにsqliteを集積したライブラリは主に二つあります.
realmは理想的な選択肢です.最初はモバイルアプリのために設計されました.nodeでも実行できますが、Windowsシステムはサポートされていません.sqlite 3はnodejsのために設計されたもので、nodejsの上に生態がもっと丈夫なので、最終的にsqlite 3を選択します.
sqlite 3はほとんどすべてのバージョンのnodejsをサポートしています.同時にnwjsと統合することもできます.
インストール
npmによるインストール
npm install sqlite3
このようにsqlite 3のnpmパッケージをインストールした以外に、最も主要なのはsqliteデータベースをもインストールし終わったことです.sqliteは組み込みデータベースなので、クライアントに組み込みます.sqlite 3は、node-pre-gypを使用して、各プラットフォームに指定されたプリコンパイルされたバイナリファイルをダウンロードします.プリコンパイルしたバイナリファイルにダウンロードできない場合、sqlite 3はnode-gypとソースコードを使って拡張を構築します.
この過程で二つのライブラリが現れます.node-pre-gypとnode-gyp.彼らは一体何ですか?
node-gypはプラットフォームをまたぐコマンドラインツールで、C++作成のnodejs拡張をコンパイルするために、まずgypはChromiumプロジェクトのために作成されたプロジェクト生成ツールで、プラットフォームに関係のない配置からプラットフォーム関連のVisual Studio、Xcode、Makefileのプロジェクトファイルを生成することができます.Linuxの二進法は速いプラットフォームを配ってするのがよくないため、すべてのnpmは便利なために、思い切って直接ソースで配布して、ユーザーが入れた時に現場でコンパイルします.しかし、いくつかのプロジェクトのバイナリ配布は、ソースの配信よりも簡単ですので、node-pre-gypの直接的なバイナリ拡張の配布があります.
両者の違いはnode-gypが拡張ソースをリリースして、インストール時にコンパイルします.node-pre-gypはコンパイル後の二段階制の形式を直接発表する拡張です.
sqlity 3と同じように、node-gypに基づいてインストールされるnpmモジュールもたくさんあります.例えば、node-sassなどはソースコードをリリースしてコンパイルしてインストールします.
ベースアプリ
sqlite 3のapiはすべて関数に基づいて調整したのです.nodejsにはjavaのjdbcのような公式のデータベースクライアントインターフェースがないので、データベースごとのapiは異なります.ここでは簡単にいくつかのsqlite 3の重要なapiを紹介します.
新しいデータベースを作成して開く
new sqlite3.Database(filename, [mode], [callback])
この方法は自動的に開いたデータベースオブジェクトを返します.パラメータ:
filename:有効値はファイル名です.例えば、「mydatebase.db」というように、データベースが開いたら「mydatebase.db」というファイルを作成してデータを保存します.ファイル名が「:memory:」であれば、メモリデータベース(h 2のような)を表します.データは永続的に保存されません.データベースを閉じると内容が失われます.
mode(オプション):データベースのモード、合計3種類の値:sqlite 3.OPEN_READONLY(読み取り専用)、sqlite 3.OPEN_READWRITE(読み書き可能)とsqlite 3.OPEN_CREATE(作成可能)デフォルト値はOPEN(u)ですREADWRITE_OPEN_uCREATE
calback(オプション):データベースのオープンまたはエラーが発生したときにこの関数を呼び出します.最初のパラメータはエラーオブジェクトです.空のときに開く成功を表します.
データベースを開く:
//       "mydatebase.db"var database;database = new sqlite3.Database("mydatebase.db", function(e){ if (err) throw err;
});//        ,        database = new sqlite3.Database(":memory:", function(e){ if (err) throw err;
});
実行後にプロジェクトのルートディレクトリで「mydatebase.db」ファイルを作成します.これはsqliteがデータを保存するファイルです.
データベースを閉じる
Database#close([callback])
この方法は、データベース接続オブジェクト、パラメータをオフにすることができます.
calback(オプション):オフに成功したコールバック.最初のパラメータはエラーオブジェクトです.「null」の場合、クローズ成功を表します.
DDLとDML文を実行します.
Database#run(sql, [param, ...], [callback])
この方法は、テーブルの作成、テーブルの削除、行データの削除、行データの挿入などのDDLとDML文を実行することができます.パラメータ:
sql:実行するSQL文字列.sqlのタイプはDDLとDLLで、DQLはこのコマンドを使用できません.実行後の戻り値には結果が含まれていません.カルバーバック関数で実行結果を取得しなければなりません.
パラム、…(オプション):SQL文にプレースホルダ(?)が含まれている場合、ここで対応するパラメータを送ることができます.ここには三つの伝値方法があります.
//         .db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);
//            .db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);
//     json  .        “:name”,“@name” “$name”。   “$name”  db.run("UPDATE tbl SET name = $name WHERE id = $id", { $id: 2, $name: "bar"});
プレースホルダの名前については、より複雑なフォームをサポートしていますので、ここでは拡張しません.興味があれば公式文書をご覧ください.
calback(オプション):もし実行に成功したら、最初のパラメータはnullです.そうでないとエラーです.
実行が成功すれば、コンテキストthisは2つの属性を含みます.lastIDとchanges.lastIDはINSERT命令文を実行する時、最後のデータのIDを表します.changesはUADTE命令とDELETE命令の時に影響するデータの行数を表します.
db.run("UPDATE foo SET id = 1 WHERE id <= 500", function(err) {if (err) throw err; //  this.changes        assert.equal(500, this.changes); done();
});
複数のステートメントを実行
Database#exec(sql, [callback])
Database_execはDatabase#run関数と同じDDLとDML文ですが、Database_excは複数の文を実行できます.また、プレースホルダパラメータをサポートしません.
database.run("CREATE TABLE foo (id INT)", function(e){ if(e !== null){ throw e;
} //    sql  ,         var sql = ""; for(var i = 0 ; i  
   
   
  

Database#get(sql, [param, ...], [callback])
sql: するSQL .sqlのタイプはDQLです.ここでは のクエリのデータのみを します.
param,…(オプション): Database nのparamパラメータ
calback(オプション): じくnullに って に します.コールバックのサインはfunctionです.クエリ セットが の 、2 のパラメータはundefinedです.そうでなければ、2 のパラメータ はクエリの のオブジェクトであり、 はjsonオブジェクトであり、 は セットの に していますので、クエリーの にリスト を えるべきです.
すべてのデータを
Database#all(sql, [param, ...], [callback])
sql: するSQL .sqlのタイプはDQLです.Database gatとは って、Database galは した をすべて します.
param,…(オプション): Database nのparamパラメータ
calback(オプション): じくnullに って に します.コールバックのサインは、ファンクラブです.rowsは、クエリ セットが の である の です.
なお、Database allは、まずすべての を してメモリに します.データ が きいかもしれないクエリコマンドの は、Database#each またはDatabase#prepareをこの の わりに ってください.
データを
Database#each(sql, [param, ...], [callback], [complete])
Database#run と じで、 のデータを べますが、 の いがあります.
コールバックのサインはfunctionです. セットが しましたが、 の はコールバックはかかりません. した ごとに、この はコールバックします. は セットの に に しています.
すべての のコールバックを び したら、completteコールバック があれば、このコールバックを び します. のパラメータはエラーオブジェクトで、2 のパラメータは です.
ステートメントの
sqlite 3のAPIは であり、いくつかの が に される があるので、sqlite 3は の フローを けるために つの を している.デフォルトはパラレルモードです.
プログレッシブ
Database#serialize([callback])
コールバックが されると、すぐに び されます.すなわち、この のコールバックは コールバックではありません.このコールバックでスケジュールされているすべてのデータベースステートメントは、 に されます. が ったら、データベースは び のモードに されます.
//            db.serialize(function() { //             db.serialize(function() { //            }); //            });//            
パラレル モード
Database#parallelize([callback])
コールバックが されると、すぐに び されます.すなわち、この のコールバックは コールバックではありません.このコールバックでスケジュールされているすべてのデータベースステートメントは して されます. が ったら、データベースは び のモードに されます.
db.serialize(function() { //             db.parallelize(function() { //            }); //            });
プリコンパイルSQL アプリ
javaのjdbcには、PreparedSttementに するアプリがあります.sql を にコンパイルし、 する に なパラメータをリンクします.このような は、sql がコンパイルされる を らすことです.sqlite 3には、このような を するapiも する.
Database#prepare(sql, [param, ...], [callback])
Database〓〓prepareを すると、コマンドオブジェクトに ります.このコマンドは り し できます.このコマンドの (statement)のアプリを てみます.
Statement#run([param, ...], [callback])Statement#get([param, ...], [callback])Statement#all([param, ...], [callback])Statement#each([param, ...], [callback])
のappi はDatabaseと の での び しと じです. なる はここのSteementオブジェクトは できます.sql の コンパイルは けられますので、プロジェクトでは の をより します.
これらの のparamパラメータは、Sttementオブジェクトに して されたパラメータです. の に、パラメータを しないと、 のパラメータが されます.
バインディングパラメータ
Statement#bind([param, ...], [callback])
Database〓〓〓prepareが する 、パラメータを び けることができるのです.ただし、この を すると、ステートメントオブジェクトと のラベルを リセットして、 に されていたすべてのパラメータを して、 を します.
ステートメントの のラベルをリセットします.
Statement#reset([callback])
ステートメントの のラベルをリセットし、パラメータバインディングを します.この を うと、 じバインディングを って じクエリーを できます.
データベース
は データベースの の な であり、sqliteはもちろん をサポートしていますが、sqlite 3は なAPIを していません.ここでは に する を げます.
var db = new sqlite3.Database(db_path);db.run("CREATE TABLE foo (id INT, txt TEXT)");db.run("BEGIN TRANSACTION");var stmt = db.prepare("INSERT INTO foo VALUES(?, ?)");for (var i = 0; i  
   
   
  

SQLCipher

SQLCipher SQLite , SQLite , 256 AES 。

sqlite3 SQLCipher , sqlcipher sqlite3 SQLCipher:

npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/node -e 'require("sqlite3")'
しかし、 はSQLCipherの を していません. な はホームページを て、この について しく してください.
promiseによるsqlite 3 APIのパッケージ
sqlite 3のAPIはnodeの のAPIの で、 の く に して ではありませんて、“ピラミッドの ” のコードが れやすいです.APIの び しをより にするために、 たちはしばしばPromiseにフィードバックをパッケージ します. はこの は がする がありません.このような を するために の があります.sqliteはこのような です. はsqlite 3に づいて、Promiseでsqlity 3のAPIを しました.コードのスタイルをもっと にして、 いやすいです.