JavaScript
alasql

alasql データベース覚書

More than 1 year has passed since last update.

JavaScript で SQL が使えるデータベースを調べたら alasql.js を見つけたので試してみました。

ブラウザのメモリ上で、テーブル作成、データの追加・更新・削除・検索が SQL で実行できます。


alasql.js 概要

alasql.js 公式サイト

AlaSQL - JavaScript SQL database console :AlaSQL をコマンド入力で試せます。

公式サイトによれば、

「ブラウザとNode.jsで動作するように設計された軽量のクライアント側インメモリSQLデータベース」

AlaSQL - 'à la SQL' - is a lightweight client-side in-memory SQL database designed to work in browser and Node.js.


  • AlaSQLは純粋なJavaScriptで書かれており、ブラウザのWebSQLデータベースは使用していません。

  • AlaSQLは、JOIN、GROUP、UNION、ANY、ALL、IN、サブクエリ、および非常に限られたトランザクションサポートを備えた、完全に機能するコンパクトなSQL Serverです。

  • AlaSQLは、ROLLUP()、CUBE()およびGROUPING SETS()関数をサポートしています

  • AlaSQLは現代版のブラウザ(Chrome、Firefox、IE、Safari)、Node.js、モバイルiOS、Androidで動作します。

  • AlaSQLはいくつかの最適化手法を使用しているため高速です。


ドキュメント

The AlaSQL Wiki


テスト環境

html, alsql.min.js 、テスト用JavaScript、ブラウザ(Chrome)があればOK

実行結果は、とりあえずコンソール出力。


test.html

<html>

<head>
<script src="alasql.min.js"></script>
<script src="test1.js"></script>
</head>
<body>
test2
</body>
</html>


テーブル作成 & SELECT

はじめに、テーブルを作成して、SELECT してみます。

alasql関数に、SELECT 文をパラメータで渡すようです。


test1.js

// テーブル作成 & SELECT

alasql("CREATE TABLE test (language INT, hello STRING)");
alasql("INSERT INTO test VALUES (1,'Hello!')");
alasql("INSERT INTO test VALUES (2,'Aloha!')");
alasql("INSERT INTO test VALUES (3,'Bonjour!')");
var rs1 = alasql("SELECT * FROM test WHERE language > 1");
console.log('t1', JSON.stringify(rs1));

結果は、json 形式で返ってきます。


console.log

t1 [{"language":2,"hello":"Aloha!"},{"language":3,"hello":"Bonjour!"}] 



配列を SELECT

同じ構造を持つ配列で実行してみます。

配列もパラメータで指定します。


test2.js

// 配列を SELECT

var data = [
{ language: 1, hello: 'Hello!' },
{ language: 2, hello: 'Aloha!' },
{ language: 3, hello: 'Bonjour!' },
]
var rs2 = alasql("SELECT * FROM ? WHERE language > 1", [data]);
console.log('t2', JSON.stringify(rs2));

結果は、テーブルの場合と同じです。


console.log

t2 [{"language":2,"hello":"Aloha!"},{"language":3,"hello":"Bonjour!"}]



Fluent Interface サポート機能

LINQ のように、書けるとあるが指定方法がよくわからない。

Where を例のように書いて実行してもうまくフィルターが効かない。

var res = alasql(data)

.Where(function(x){x.Population>1000000})
.OrderBy("Name")
.exec();

Select()

From()

GroupBy()

Having()

OrderBy()

Top()


Literals

データベース、テーブルなどオブジェクトに使用できる文字は、下記のとおり。


  • A-Z

  • a-z

  • _ (underscore)

  • 0-9 (except first character)


コメント

コメントは、通常の SQL と同じ


  • 複数行のコメントは、 /* and */

  • 1行のコメントは、 「--」で始める

/*

My
multi-line
comments
*/

SELECT * FROM one; -- and this is comments also
-- and this
-- and this


Data Types

Integer, Decimal, Float, Char などブラウザ上で扱うデータなら問題なさそう。


SELECT

何だか普通に SELECT の指定が使えそうです。

WITH

SELECT columns

REMOVE COLUMNS columns / LIKE pattern

TOP / LIMIT FETCH

DISTINCT

INTO

FROM

JOIN ON / USING

APPLY

LET

GROUP BY

HAVING

WHERE

ORDER BY

UNION / UNION ALL /INTERSECT / EXCEPT / CORRESPONDING


SEARCH

JSON を検索するのに使えそうです。


トランザクション処理

TRANSACTION, COMMIT, ROLLBACK

なんと、トランザクションもサポートしています。


プログラム

alasql 内で実行できるストアドプロシージャーのようなものもあります。

ブラウザ上でここまで、やるのかな?

DECLARE

SET

IF THEN, IF THEN ELSE

BEGIN END

WHILE

SOURCE


次にやること

ある程度のデータ件数で実際にどの程度つかえるのかを試してみたいと思います。


あとがき

ブラウザ上で使うには、十分すぎる機能を持っていると思います。

SQL の構文も特殊なものではなく、普通に書けます。