13161216443

您所在位置: 首頁> 學習課程> java培訓 | JS專用的內存型數據庫[github項目精選0x01]

java培訓 | JS專用的內存型數據庫[github項目精選0x01]

發布百知教育 來源:學習課程 2019-11-13

對于沒有耐心的人,請在這里處嘗試 Demo

sql.js 是 SQLite 到 Webassembly 的端口,是用 Emscripten 編譯的 SQLite C 代碼。它使用存儲在內存中的虛擬數據庫文件,因此不會保留所做的更改到數據庫。但是,它允許你導入任何現有的 sqlite 文件,并將創建的數據庫導出為 JavaScript 類型數組。

沒有 C 綁定或 node-gyp 編譯,sql.js 是一個簡單的JavaScript 文件,可以像傳統的 JavaScript 庫一樣使用。如果你在 JavaScript 中創建本機應用程序(例如 Electron),或者在 node.js 中工作,那么你可能更喜歡使用 SQLite 與 JavaScript 的本機綁定。

SQLite是 Public Domain,sql.js 是 MIT license。

Sql.js 的開發早于 WebAssembly,因此是作為 asm.js 項目啟動的?,F在它仍然保持對 asm.js 的向后兼容。

二進制版本

Sql.js 的最后構建日期:

Emscripten 版本 1.38.30(2019-04-16)發布歷史

SqlLite 版本:3.28.0(2019-4-16)發布歷史

文檔

完整文檔根據源代碼生成,可用。

用法

 1var initSqlJs = require('sql.js');
2// or if you are in a browser:
3// var initSqlJs = window.initSqlJs;
4
5initSqlJs().then(SQL => {
6
7  // Create a database
8  var db = new SQL.Database();
9  // NOTE: You can also use new SQL.Database(data) where
10  // data is an Uint8Array representing an SQLite database file
11
12  // Execute some sql
13  sqlstr = "CREATE TABLE hello (a int, b char);";
14  sqlstr += "INSERT INTO hello VALUES (0, 'hello');"
15  sqlstr += "INSERT INTO hello VALUES (1, 'world');"
16  db.run(sqlstr); // Run the query without returning anything
17
18  var res = db.exec("SELECT * FROM hello");
19  /*
20  [
21    {columns:['a','b'], values:[[0,'hello'],[1,'world']]}
22  ]
23  */

24
25  // Prepare an sql statement
26  var stmt = db.prepare("SELECT * FROM hello WHERE a=:aval AND b=:bval");
27
28  // Bind values to the parameters and fetch the results of the query
29  var result = stmt.getAsObject({':aval' : 1':bval' : 'world'});
30  console.log(result); // Will print {a:1, b:'world'}
31
32  // Bind other values
33  stmt.bind([0'hello']);
34  while (stmt.step()) console.log(stmt.get()); // Will print [0, 'hello']
35
36  // You can also use JavaScript functions inside your SQL code
37  // Create the js function you need
38  function add(a, b{return a+b;}
39  // Specifies the SQL function's name, the number of it's arguments, and the js function to use
40  db.create_function("add_js", add);
41  // Run a query in which the function is used
42  db.run("INSERT INTO hello VALUES (add_js(7, 3), add_js('Hello ', 'world'));"); // Inserts 10 and 'Hello world'
43
44  // free the memory used by the statement
45  stmt.free();
46  // You can not use your statement anymore once it has been freed.
47  // But not freeing your statements causes memory leaks. You don't want that.
48
49  // Export the database to an Uint8Array containing the SQLite database file
50  var binaryArray = db.export();
51});

演示

有一些示例可在這里得到【kripken.github.io/sql.js/index】。功能最全的是 Sqlite 解釋器【kripken.github.io/sql.js/examples/GUI/index】。

例子

測試文件提供了關于 api 使用的最新示例。

在瀏覽器中

HTML 示例文件:

 1<meta charset="utf8" />
2<html>
3  <script src='/dist/sql-wasm.js'></script>
4  <script>
5    config = {
6      locateFilefilename => `/dist/${filename}` 
7    }
8    // The `initSqlJs` function is globally provided by all of the main dist files if loaded in the browser.
9    // We must specify this locateFile function if we are loading a wasm file from anywhere other than the current html page's folder.
10    initSqlJs(config).then(function(SQL){
11      //Create the database
12      var db = new SQL.Database();
13      // Run a query without reading the results
14      db.run("CREATE TABLE test (col1, col2);");
15      // Insert two rows: (1,111) and (2,222)
16      db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
17
18      // Prepare a statement
19      var stmt = db.prepare("SELECT * FROM test WHERE col1 BETWEEN $start AND $end");
20      stmt.getAsObject({$start:1$end:1}); // {col1:1, col2:111}
21
22      // Bind new values
23      stmt.bind({$start:1$end:2});
24      while(stmt.step()) { //
25        var row = stmt.getAsObject();
26        console.log('Here is a row: ' + JSON.stringify(row));
27      }
28    });
29  
</script>
30  <body>
31    Output is in Javascript console
32  </body>
33</html>

從用戶選擇的文件創建數據庫

構造函數 SQL.Database  把表示數據庫文件的整數數組作為可選參數。

以下代碼用 HTML input 作為加載數據庫的來源:

1dbFileElm.onchange = () => {
2  var f = dbFileElm.files[0];
3  var r = new FileReader();
4  r.onload = function({
5    var Uints = new Uint8Array(r.result);
6    db = new SQL.Database(Uints);
7  }
8  r.readAsArrayBuffer(f);
9}


從服務器加載數據庫

 1var xhr = new XMLHttpRequest();
2// For example: https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite
3xhr.open('GET''/path/to/database.sqlite'true);
4xhr.responseType = 'arraybuffer';
5
6xhr.onload = e => {
7  var uInt8Array = new Uint8Array(this.response);
8  var db = new SQL.Database(uInt8Array);
9  var contents = db.exec("SELECT * FROM my_table");
10  // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]
11};
12xhr.send();


在 node.js 中使用

sql.js 托管在 npm 上。你只需運行 npm install sql.js 就能安裝。

另外,你也可以從下面的下載鏈接中簡單地下載 sql-wasm.js  sql-wasm.wasm。

從磁盤讀取數據庫:

1var fs = require('fs');
2var initSqlJs = require('sql-wasm.js');
3var filebuffer = fs.readFileSync('test.sqlite');
4
5initSqlJs().then(function(SQL){
6  // Load the db
7  var db = new SQL.Database(filebuffer);
8});

將數據庫寫入磁盤

你需要將 db.export 的結果轉換為 buffer

1var fs = require("fs");
2// [...] (create the database)
3var data = db.export();
4var buffer = new Buffer(data);
5fs.writeFileSync("filename.sqlite", buffer);


用作 web worker

如果你不想在程序的主線程中運行 CPU 密集型 SQL 查詢,可以使用更有限的 WebWorker API。

你將需要下載 dist/worker.sql-wasm.js【dist/worker.sql-wasm.js】 和 dist/worker.sql-wasm.wasm【dist/worker.sql-wasm.wasm】.。

例:

 1<script>
2  var worker = new Worker("/dist/worker.sql-wasm.js");
3  worker.onmessage = () => {
4    console.log("Database opened");
5    worker.onmessage = event => {
6      console.log(event.data); // The result of the query
7    };
8
9    worker.postMessage({
10      id2,
11      action'exec',
12      sql'SELECT * FROM test'
13    });
14  };
15
16  worker.onerror = e => console.log("Worker error: ", e);
17  worker.postMessage({
18    id:1,
19    action:'open',
20    buffer:buf, /*Optional. An ArrayBuffer representing an SQLite Database file*/
21  });
22
</script>

有關完整的例子,請參見 examples/GUI/gui.js【examples/GUI/gui.js】 。

Flavors/versions Targets/Downloads

該庫包含 Sqlite 的 WebAssembly 和 asm.js 兩個版本。(WebAssembly 是較新的,也是首選的編譯為 JavaScript 的方法,它已經取代了 asm.js。它會生成更小、更快的代碼。)包含 Asm.js 版本是為了兼容性的考慮。

從 0.x 升級到 1.x

sql.js 的 1.0 版必須異步加載,而 asm.js 則可以同步加載。

所以在過去,你應該:

1<script src='js/sql.js'></script>
2<script>
3  var db = new SQL.Database();
4  //...
5
</script>

或者

1var SQL = require('sql.js');
2var db = new SQL.Database();
3//...

在版本1.x 中:

1<script src='dist/sql-wasm.js'></script>
2<script>
3  initSqlJs({ locateFilefilename => `/dist/${filename}` }).then(function(SQL){
4    var db = new SQL.Database();
5    //...
6  });
7
</script>

或者:

1var initSqlJs = require('sql-wasm.js');
2initSqlJs().then(function(SQL){
3  var db = new SQL.Database();
4  //...
5});

現在,NOTHING 是 SQLite 中的保留字,而以前不是。這可能會導致類似 Error: near "nothing": syntax error 的錯誤。

下載與使用:

盡管 asm.js 文件是作為單個 Javascript 文件分發的,但 WebAssembly 庫卻能夠最有效地對.js 加載器和 .wasm 文件進行分發,例如 dist/sql-wasm.js  dist/sql-wasm.wasm。.js 文件負責包裝與加載 .wasm 文件。

包含在 distributed artifacts 中的sql.js版本

對于每個 relase【https://github.com/kripken/sql.js/releases/】,你都會在 release assets 中找到一個名為sqljs.zip 的文件。它包含:

  • sql-wasm.js:WebAssembly 版本的Sql.js。適合生產環境。如果選擇它,則還需要包含sql-wasm.wasm。

  • sql-wasm-debug.js:Sql.js 的 WebAssembly 調試版本。更大,打開了斷言,這對本地開發很有用。如果使用它,則需要包含 sql-wasm-debug.wasm。

  • sql-asm.js:Sql.js 的 asm.js 舊版本。較慢且更大。出于兼容性的原因提供。

  • sql-asm-memory-growth.js:默認情況下,Asm.js 不允許內存增長,因為它速度較慢且會進行優化。如果你正在使用 sql-asm.js 并看到這個錯誤:Cannot enlarge memory arrays,請使用此文件。

  • sql-asm-debug.js:Sql.js 的 Debug asm.js 版本。用它進行本地開發。

  • worker.* :以上庫的 Web Worker 版本。API 更加有限。有關它的示例,請參見 examples/GUI/gui.js【examples/GUI/gui.js】。

編譯

  • 安裝 EMSDK

  • 運行 npm run rebuild


注釋:內容來自微信公眾號前端先鋒


java培訓班:http://www.akpsimsu.com/java2019




上一篇:java培訓 | 解決 JavaScript 中處理 null 和 undefined 的麻煩事

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.akpsimsu.com

有位老師想和您聊一聊

關閉

立即申請