27
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

alasql データベース覚書

Last updated at Posted at 2017-02-13

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 の構文も特殊なものではなく、普通に書けます。

27
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?