알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

[AlaSql]Web Brower local in memory DB 소개 (server-less) 본문

AlaSQL

[AlaSql]Web Brower local in memory DB 소개 (server-less)

백곳 2019. 2. 27. 17:44

[AlaSql]Web Brower local in memory DB 소개



open site  https://github.com/agershun/alasql


lisense : MIT


필자는 업무상 Web 으로 대용량 데이터를 처리하는 일을 시작 하게 됬다.


대용량 List 에서 Filter,find,map,for 등 이용해서 전체를 긁어서 데이터를 select 하고 조건을 찾고 하는건 끔찍하다고 생각 했다.


그래서 Web 에서 사용할수 있는 DB를 찾아 보았다. 


하지만 Web Brower local in memory DB 는 생각보다 솔류션이 적었다.


기존에 리포팅 한 Lokijs  가 있지만 프로젝트의 진행 현황 느낌상 거의  리비전이 되지 않는 느낌을 받았다.


열정이 꺽인 느낌 ? ㅎㅎ


그래서


신속하게 데이터를 처리하고 파싱에 사용 하는 코드량을 줄이고 싶어서 인터넷에서 치열하게 검색하고 찾은것이


AlaSql 이다.



일단 대부분 web에  javascirpt 데이터 베이스는



위와 같다.


하지만 ERP,MES 또는 각종 대용량 그래프 처리 엑셀 데이터 표시 등 업무 를 하시는 분들을 아시겠지만


원하는건 BeckEnd -> Pront 로 데이터를 던져 주면 Pront 에서 보다 쉽고 빠르게 데이터를 처리 하기를 원할것 같다.


그리고 웹브라우져를 닫으면 데이터가 지워 줘야 Client PC에 용량이 늘어나지 않는데


비정상 종료시에는 지울수가 없을때가 있고 매번 초기화에서 기존 데이터를 지워줘야 하는 번거러움도 있다.


물론 IndexedDB가 처리하는 용량에 Limit 가 있다 생각 보다 꽤 작다.


400mb  500mb 이런 데이터는 처리 할수가 없다 .


그렇지만 AlaSql 는  가능 하다.



일단 라이브러리가 디자인 된 것을 보면


  • Fast in-memory SQL data processing for BI and ERP applications on fat clients
  • Easy ETL and options for persistence by data import / manipulation / export of several formats
  • All major browsers, Node.js, and mobile applications

본문에 나와 있듯이

ERP 데이터를 in-memory 로 빠르게 처리 해주는것을 고려 하였다.


그리고 개발자에게 반가 운것은 예제 코드를 보면


/* create SQL Table and add data */
alasql("CREATE TABLE cities (city string, pop number)");

alasql("INSERT INTO cities VALUES ('Paris',2249975),('Berlin',3517424),('Madrid',3041579)");

/* execute query */
var res = alasql("SELECT * FROM cities WHERE pop < 3500000 ORDER BY pop DESC");

// res = [ { "city": "Madrid", "pop": 3041579 }, { "city": "Paris", "pop": 2249975 } ]


Live Demo  << 데모사이트


위와 같이 기존 SQL 문법을 사용 할수 있다 .


SQL-99 language  까지 지원 한다고 나와 있다.


또한 코딩량을 많이 줄여주는 재미있는 문법도 있는데


var data = [ {a: 1, b: 10}, {a: 2, b: 20}, {a: 1, b: 30} ];

var res = alasql('SELECT a, SUM(b) AS b FROM ? GROUP BY a',[data]);

// res = [ { "a": 1, "b": 40},{ "a": 2, "b": 20 } ]


위와 같이 사용도 된다.


그리고 기쁜 소식중 한개는


Excel 이 import/export 가 된다.


// file is read asynchronously (Promise returned when SQL given as array)
alasql(['SELECT * FROM XLS("./data/mydata") WHERE lastname LIKE "A%" and city = "London" GROUP BY name '])
    .then(function(res){
        console.log(res); // output depends on mydata.xls
    }).catch(function(err){
        console.log('Does the file exist? There was an error:', err);
    });



그리고 DB에 대용량 insert가 쉽게 될수 있도록


Bulk Data Load 도지원 된다.


alasql("CREATE TABLE example1 (a INT, b INT)");

// alasql's data store for a table can be assigned directly
alasql.tables.example1.data = [
    {a:2,b:6},
    {a:3,b:4}
];

// ... or manipulated with normal SQL
alasql("INSERT INTO example1 VALUES (1,5)");

var res = alasql("SELECT * FROM example1 ORDER BY b DESC");

console.log(res); // [{a:2,b:6},{a:1,b:5},{a:3,b:4}]


SQLite data base 파일을 읽을수도 있다.



<script src="sql.js"></script>
<script>
    alasql([
        'ATTACH SQLITE DATABASE Chinook("Chinook_Sqlite.sqlite")',
        'USE Chinook',
        'SELECT * FROM Genre'
    ]).then(function(res){
        console.log("Genres:",res.pop());
    });
</script>



그리고 Custom Funtion도 지원 된다, RMDB 에서 프로시져 같은거로 보인다.


alasql.fn.myfn = function(a,b) {
    return a*b+1;
};
var res = alasql('SELECT myfn(a,b) FROM one');


그리고  아래와 같은 기능도 좋은것 같다.


var ins = alasql.compile('INSERT INTO one VALUES (?,?)');
ins(1,10);
ins(2,20);


이정도면 실제로 대용량을 돌려 보고 성능을 알수 있겠지만 소개로만으로는 휼륭 하다고 생각한다.



'AlaSQL' 카테고리의 다른 글

[AlaSQL] MAX_STRING Aggregators group by 문제 해결  (0) 2019.03.04
Comments