详细了解SQL.js的基本功能

3,336 阅读6分钟

SQL,即结构化查询语言,是一种特定领域的语言,旨在访问和操作关系数据库中的数据。在SQL语句的帮助下,你可以在关系型数据库上执行创建、更新、检索和删除数据等操作。

关系数据库是一种数据模型,它使用行和列将数据组织在一个表中。虽然可能有多个使用SQL的关系数据库管理系统,但几乎所有这些系统都被设计为服务器端进程。这些系统包括,除其他外。

  • MySQL
  • PostgreSQL
  • SQLite
  • MSSQL

在本教程中,我们将讨论SQL.js,这是一个JavaScript SQL库,使你能够完全在浏览器中创建和查询关系型数据库。

我们将通过以下步骤,并为每一部分提供一个详细的例子。

什么是SQL.js?

SQL.js是一个JavaScript库,允许你完全在浏览器中创建和查询一个关系数据库。它使用一个存储在浏览器内存中的虚拟数据库文件,所以它不会持久化对数据库的修改。

这个库还使用Emscripten将SQLite编译成WebAssembly(Wasm)。有了这个功能,你可以很容易地把现有的SQLite数据库引入到SQL.js中使用,也可以把在SQL.js中创建的数据库转换成SQLite。

使用SQL.js的优点和缺点

使用SQL.js有几个优点。它是为客户端建立的,并完全在客户端工作,这意味着它不需要任何服务器端的进程来工作。它比MySQL、PostgreSQL和其他需要第三方软件才能使用的软件更容易设置。开始使用SQL.js就像在一个现有的HTML项目中安装jQuery一样容易。而且SQL.js提供了对执行包含多个语句的单一SQL字符串的支持,如下图所示。

sqlstr = "CREATE TABLE tableName(colA, colB);";
sqlstr += "INSERT INTO hello VALUES (0, 'hello');"
    ....

但是也有一个重要的缺点:使用SQL.js时对数据库的改变是不持久的。再读一遍:当你重新加载你的浏览器时,对你的数据库所做的所有改变将不复存在。这是因为SQL.js使用一个存储在浏览器内存中的虚拟数据库文件。然而,你可以导入任何现有的SQLite文件,并将创建的数据库导出为一个JavaScript类型的数组。

安装SQL.js

浏览器安装

将SQL.js集成到一个新的基于客户端的项目中是超级容易的。你可以通过包括CDN或下载源文件并将其链接到你的标记页面来开始。

默认情况下,SQL.js使用WebAssembly,除了JavaScript库之外,还需要加载一个.wasm 文件。你可以在线下载这个文件,并使用locateFile 函数在你的网页中加载这个文件,像这样。

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Page Title</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/sql-wasm.js"></script>
    <script>
      // Load sql.js WebAssembly file
      let config = {
        locateFile: () => "/path/to/downloaded/sql-wasm.wasm",
      };
      initSqlJs(config).then(function (SQL) {
          console.log("sql.js initialized 🎉");
      });
    </script>
  </head>
  <body></body>
</html>

在上面的代码块中,我们使用initSqlJs 来异步加载Wasm二进制文件,并在加载所需文件后初始化SQL.js。

Node.js的安装

在基于Node的项目中安装SQL.js也是非常简单的。要安装它,你可以简单地运行。

npm install sql.js

或者,你可以从前面的链接中下载sql-wasm.jssql-wasm.wasm ,并使用Node.jsrequire 函数在你的项目中加载它们。

另外,在基于Node的项目中,你可以跳过locateFile 方法来加载sql-wasm.wasm 文件,因为如果它与你正在处理的当前文件在同一个文件夹中,它将自动加载。因此,我们的代码将看起来像这样。

var initSqlJs = require("./sql-wasm.js");

initSqlJs().then(function (SQL) {
  console.log("sql.js initialized 🎉");
});

编写SQL查询和预备语句

现在我们已经按照所有需要的步骤来安装和初始化SQL.js,让我们深入了解它的使用。

创建一个数据库

下面的代码创建了一个新的数据库。

const db = new SQL.Database();

值得注意的是,SQL.Database() 方法接受一个可选的参数data ,它必须是一个代表SQLite数据库文件的Uint8Array 。例如,在Node.js中,我们可以像下面这样加载一个现有的.sqlite 文件。

let fs = require("fs");
let initSqlJs = require("./sql-wasm.js");
let filebuffer = fs.readFileSync("/path/to/sample.sqlite");

initSqlJs().then(function (SQL) {
  // Create a new database with our existing sample.sqlite file
  const db = new SQL.Database(filebuffer);
});

在上面的代码中,我们使用内置的Node.jsfspath 模块来读取我们现有的sample.sqlite 文件。

运行SQL语句

一个SQL语句可以是在数据库中创建或检索一条信息的请求,或者是对现有数据进行操作。

使用SQL.js,你可以很容易地运行一个语句,而不读它的结果。语法如下所写。

db.run(stmt);

参数stmt ,当然是你的SQL语句。下面是一个例子,说明如何在我们的数据库中创建一个名为users 的新表,其中有ID、姓名、电话号码和地址等列。它还将在这个表中插入一条新的记录。

let initSqlJs = require("./sql-wasm.js");

initSqlJs().then(function (SQL) {
  const db = new SQL.Database();
  // RUNNING SQL QUERIES 👇
  db.run("CREATE TABLE users (id, name, phone, address);");
  db.run(
    `INSERT INTO users (id, name, phone, address)
        VALUES (1, 'John Doe', '+234-907788', '12 Igodan Street, Okitipupa')`
  );
});

预备的SQL语句

你可以使用准备好的语句来重复执行相同或类似的SQL语句,而且效率很高。准备好的语句比运行的SQL语句的解析时间要短得多,因为对查询的准备工作只做一次。它们对于防止SQL注入也非常有用,因为你不需要转义参数值,这些参数值会在以后使用不同的协议进行传输。

使用SQL.js,我们也可以使用.prepare() 方法编写准备好的语句。

var stmt = db.prepare(preparedStatement);

下面是一个例子,在我们以前的数据库中获取所有ID在1到10之间的用户。

var stmt = db.prepare("SELECT * FROM users WHERE id BETWEEN $start AND $end");

  stmt.bind({ $start: 1, $end: 2 });
  while (stmt.step()) {
    var row = stmt.getAsObject();
    console.log("Here is a user row: " + JSON.stringify(row));
  }

在写完我们准备好的SQL语句后,我们使用.bind() 方法来绑定我们的语句所需的值(在上面的例子中是startend )。继续前进,我们将使用while 循环来返回所有可能的行,并将它们记录到控制台。

将数据库写到磁盘上

SQL.js还提供了一个选项,可以通过db.export() 方法将数据库导出/写入磁盘,成为一个.sqlite 文件。结果将以Uint8Array ,你可以使用Node.js的Buffer 类和文件系统包来把数据库写入磁盘。

var fs = require("fs");
/***
  Code to create a database here
***/
// Export database 👇
var data = db.export();
var buffer = new Buffer(data);
fs.writeFileSync("new-db.sqlite", buffer);

运行上述代码后,你应该在你的项目根目录下看到一个名为new-db.sqlite 的新文件。

总结

在这篇文章中,我们介绍了SQL.js,它提供的功能,以及如何在现实世界的应用中使用它。虽然SQL.js可能很适合建立一个离线优先的应用程序,如记事本应用程序,但在你想从管理面板管理用户数据的情况下,你可能要考虑使用其他关系数据库(MySQL、PostgreSQL)。

进一步阅读

The postA detailed look at basic SQL.js featuresappeared first onLogRocket Blog.