2013-02-08 10 views
18

Dla jednej z naszych platform Insights planujemy generować podsumowujące bazy danych SQLite3 w tle i umożliwić ich renderowanie w przeglądarce jako wykresach. Obecnie zamierzamy uzyskać punkt końcowy po stronie serwera, który będzie obsługiwał wymóg dotyczący danych.Jaki jest najlepszy sposób, aby przeczytać Sqlite3 bezpośrednio w przeglądarce przy użyciu Javascript?

Chcemy zoptymalizować to dalej, całkowicie eliminując punkt końcowy po stronie serwera. Jesteśmy w porządku (z punktu widzenia bezpieczeństwa), aby odsłonić SQLite3 bezpośrednio na S3 i mieć moduł javascript odczytać i wygenerować wykresy.

Pliki SQLite3 mają być dość małe - być może 4-6 kolumn i być może 10-500 wierszy danych, a wszystkie z nich zawierają tylko jedną tabelę. Testy wskazują rozmiary plików mniejsze niż 15 KB. Nie zamierzamy pisać ani edytować SQLite3 w przeglądarce. Nie musimy buforować go w przeglądarce jako formularza WebSQL lub IndexedDB, ale możemy z nich korzystać, jeśli jest to potrzebne.

Z moich wyszukiwań internetowych nie można znaleźć biblioteki JavaScript, która może odczytać plik SQLite3 i zapytać go o wyniki. Jeśli znasz jakieś biblioteki javascript, które mogą to zrobić, daj nam znać.

Z drugiej strony, jeśli myślisz, że nie powinniśmy robić tego z jakiegokolwiek powodu, to wyślijcie je również jako komentarze/odpowiedzi, ponieważ jest to coś, co próbujemy po raz pierwszy i wydaje się mało -of-the-box, więc opinie mile widziane!

+1

To nie może być zrobione przez JavaScript bezpośrednio - jednak WebSQL/IndexedDB * siła * użycie SQLite pod spodem; ale to szczegół implementacji. (SQLite * wymaga * wewnętrznego dostępu do systemu plików [local] w większości przypadków.) –

+0

.. i nie mogę sobie wyobrazić * pełnego przepisania * silnika bazy danych, który potrafi odczytać dane SQLite w JavaScript (np. W danych pamięci tylko) byłoby bardzo praktyczne, ale [byłem zaskoczony wcześniej] (http://bellard.org/jslinux/). –

+0

@pst dotyczące twojego pierwszego komentarza, tak, wiem, że mogą używać SQLite pod spodem, ale z naszej strony, konieczność przeniesienia go z serwera i zsynchronizowania go z WebSQL/IndexedDB wydaje się zbyt dużym kłopotem i utrzymaniem w długim biegać. – Shreeni

Odpowiedz

3

Nie mogę powiedzieć najlepiej, ale jedno: Napisz samodzielnie bibliotekę JavaScript SQLite. To będzie żmudne zadanie, ale jestem pewien, że można to zrobić. Niektórzy fajni ludzie zrobili pdf.js, który jest rendererem JavaScript dla plików PDF, które są również binarnymi obiektami typu BLOB, takimi jak SQLite files.

Najprawdopodobniej zaczniesz od FileReader API przejść przez plik SQLite, a następnie utworzysz w pamięci reprezentację treści, z której może korzystać narzędzie do tworzenia wykresów.

Zastrzeżenie: Prawdopodobnie chcesz rozwiązać swój początkowy problem za pomocą innego rozwiązania, zgodnie z propozycją innych, ale to odpowiada na twoje pytanie.

+4

Zostało zrobione (używając Emscriptena) https://github.com/kripken /sql.js – Prinzhorn

+0

Po prostu wow! ........... – Marcel

+0

Akceptuję odpowiedź @ Marcel, ponieważ wydaje się, że nie ma lepszej odpowiedzi w tej chwili (dla strony klienta JS). – Shreeni

12

Istnieje biblioteka javascript o nazwie sql.js, która może zrobić dokładnie to, co chcesz. W twoim przypadku, należy używać go jak ten

var xhr = new XMLHttpRequest(); 
xhr.open('GET', '/path/to/database.sqlite', true); 
xhr.responseType = 'arraybuffer'; 

xhr.onload = function(e) { 
    var uInt8Array = new Uint8Array(this.response); 
    var db = new SQL.Databse(uInt8Array); 
    var contents = db.exec("SELECT * FROM my_table"); 
    // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}] 
}; 
xhr.send(); 

Zobacz dokumentację na http://lovasoa.github.io/sql.js/documentation

+1

+10. To jest rozwiązanie. Zatwierdzenia lovasoa zostały scalone w oryginalnym pliku sql.js, pobierz go na https://github.com/kripken/sql.js. Powyższy przykład należy zmodyfikować w jeden sposób: dodaj 'var SQL = window.SQL;' na górze (po dołączeniu pliku sql.js i zmianie 'my_table' oczywiście). Działa świetnie (użyłem Chrome). –

Powiązane problemy