2010-10-16 11 views
8

Pracuję nad rozszerzeniem do Chrome, które używa WebSQL do przechowywania danych historycznych. Będąc WebSQL, DB jest przechowywany na kliencie.Wyeksportowanie (zrzut) danych WebSQL

Chciałbym dodać opcję eksportu/importu takich danych, aby użytkownik mógł udostępniać/wykorzystywać te dane innym użytkownikom lub innym komputerom.

To są moje pierwsze kroki w bazie danych tylko dla klientów, więc zastanawiam się, jak to zrobić. Myślałem, aby przekonwertować DB na ogromny ciąg json, który użytkownik może kopiować/wklejać, ale nie wygląda bardzo przyjazny dla użytkownika.

Czy istnieje lepsze rozwiązanie?

Odpowiedz

15

Dostałem rozwiązanie do zrzucania pojedynczego stołu działające na HTML5 database client, które napisałem kilka dni temu.

Sprawdź pod numerem http://html5db.desalasworks.com/script.js i przewiń w dół do SqlClient.exportTable, ma to przykład, który należy rozszerzyć, aby pokryć całą bazę danych.

Kroki są:

Krok 1: Tworzenie schematu:

SELECT sql FROM sqlite_master 

Krok 2: Uzyskaj listę tabel:

SELECT tbl_name from sqlite_master WHERE type = 'table' 

Krok 3: Pętla przez każdego z nich i utworzyć skrypt INSERT z wynikami

transaction.executeSql("SELECT * FROM " + _tbl_name + ";", [], 
    function(transaction, results) { 
     if (results.rows) { 
      for (var i = 0; i < results.rows.length; i++) { 
       var row = results.rows.item(i); 
       var _fields = []; 
       var _values = []; 
       for (col in row) { 
        _fields.push(col); 
        _values.push('"' + row[col] + '"'); 
       } 
       _exportSql += ";\nINSERT INTO " + _tbl_name + "(" + _fields.join(",") + ") VALUES (" + _values.join(",") + ")"; 
      } 
     } 
    } 
); 

Mam nadzieję, że jest to przydatne.

UPDATE stycznia 2016 - cały DB EXPORT

Mam JS websqldump biblioteki, który można pobrać z github, jak również.

Ten wyeksportuje bazę danych całą. Sprawdź kod na:

https://github.com/sdesalas/websqldump

Wykorzystanie następująco

websqldump.export({ 
    database: 'NorthwindLite', 
    success: function(sql) {alert(sql);} 
}); 
+0

Wygląda świetnie, spróbuje szybko, dzięki – Omiod

+0

Ok. Zatem twoim zamiarem jest zaimportowanie bazy danych, wystarczy uruchomić każdą linię eksportu i db.executeSQL. Ładnie wykonane. Ale byłoby rozsądnie oferować CREATE [baza danych | table] JEŚLI NIE ZNAJDUJE SIĘ tam przed napływem instrukcji wstawiania. –

+0

Gdzie gra Krok 1? –

-1

Nie jest to najbardziej elegancki sposób, a zarazem najbardziej dogodnym.
Wystarczy wkleić skrypt w chrome debugger tools, a następnie wywołać c(), a powinieneś pobrać plik.

var looongSQL = ""; 

var x = function (options) { 
if (options.n < options.sqlTables.length) { 
    onTheMove.openLocalDatabase().transaction(
     function (tx) { 
      var sqlStatement = "SELECT * FROM " + options.sqlTables[options.n]; 
      tx.executeSql(sqlStatement, [], 
       function (tx, rslt) { 
        if (rslt.rows) { 
         for (var m = 0; m < rslt.rows.length; m++) { 
          var dataRow = rslt.rows.item(m); 
          var _fields = []; 
          var _values = []; 
          for (col in dataRow) { 
           _fields.push(col); 
           _values.push('"' + dataRow[col] + '"'); 
          } 
          looongSQL += "INSERT INTO " + options.sqlTables[options.n] + "(" + _fields.join(",") + ") VALUES (" + _values.join(",") + ");\n"; 
         } 
        } 
        options.n++; 
        x(options); 
       } 
      ); 
     }); 
}else 
{ 
document.location = 'data:Application/octet-stream,' + 
      encodeURIComponent(looongSQL); 
} 

}; 
var c = function() { 
onTheMove.openLocalDatabase().transaction(
    function (transaction) { 
     transaction.executeSql("SELECT sql FROM sqlite_master;", [], 
      function (transaction, results) { 
       var sqlStatements = []; 

       if (results.rows) { 
        for (var i = 0; i < results.rows.length; i++) { 
         console.log(results.rows.item(i)); 
         var row = results.rows.item(i); 
         if (row.sql != null && row.sql.indexOf("CREATE TABLE ") != -1 && row.sql.indexOf("__") == -1) { 
          var tableName = row.sql.replace("CREATE TABLE ", "").split(/ |\(/)[0]; 
          sqlStatements.push('DROP TABLE IF EXISTS ' + tableName); 
         }if(row.sql != null && row.sql.indexOf("__") == -1){ 
         sqlStatements.push(row.sql);} 
        } 
       } 

       for (var j = 0; j < sqlStatements.length; j++) { 
        if (sqlStatements[j] != null) { 
         looongSQL += sqlStatements[j] + ';\r\n'; 
        } 
       } 

       transaction.executeSql("SELECT tbl_name from sqlite_master WHERE type = 'table'", [], 
        function (transaction, res) { 
         var sqlTables = []; 
         for (var k = 0; k < res.rows.length; k++) { 
          if (res.rows.item(k).tbl_name.indexOf("__") == -1) { 
           sqlTables.push(res.rows.item(k).tbl_name); 
          } 
         } 
         x({ 
          sqlTables: sqlTables, 
          n: 0 
         }); 
        }); 

      } 
     ); 
    }); 
}; 

Inna wersja, która eksportuje go jako JSON

var looongSQL = "[\n"; 
var stringidiedLocalStorage = JSON.stringify(JSON.stringify(localStorage)); 
looongSQL += "/* 1 */ " + stringidiedLocalStorage + ",\n"; 
var x = function (options) { 
if (options.n < options.sqlTables.length) { 
    onTheMove.openLocalDatabase().transaction(
     function (tx) { 
      var sqlStatement = "SELECT * FROM " + options.sqlTables[options.n]; 
      tx.executeSql(sqlStatement, [], 
       function (tx, rslt) { 
        if (rslt.rows && rslt.rows.length > 0) { 
         var _fields = []; 

         for (var col in rslt.rows.item(0)) { 
          _fields.push(col); 
         } 
         var insertTableSQL = "\"INSERT INTO " + options.sqlTables[options.n] + "(" + _fields.join(",") + ") "; 
         looongSQL += "/* " + options.count + " */ " + insertTableSQL; 


         for (var m = 0; m < rslt.rows.length; m++) { 
          var dataRow = rslt.rows.item(m); 

          var _values = []; 
          for (var col in dataRow) { 
           _values.push('\'' + dataRow[col] + '\''); 
          } 
          looongSQL += "SELECT " + _values.join(","); 
          if (m < rslt.rows.length - 1 && (m % 499 != 0 || m == 0)) { 
           looongSQL += " UNION ALL "; 
          } 
          if (m % 499 == 0 && m != 0) { 
           options.count++; 
           looongSQL += "\",\r\n/* " + options.count + " */ " + insertTableSQL; 
          } 
         } 

         looongSQL += "\",\r\n"; 
         options.count++; 
        } 
        options.n++; 
        x(options); 
       } 
      ); 
     }); 
} else { 
    looongSQL += ']'; 
    document.location = 'data:Application/octet-stream,' + 
     encodeURIComponent(looongSQL); 
} 

}; 
var c = function() { 
onTheMove.openLocalDatabase().transaction(
    function (transaction) { 
     transaction.executeSql("SELECT sql FROM sqlite_master;", [], 
      function (transaction, results) { 
       var sqlStatements = []; 
       var count = 2; 
       if (results.rows) { 
        for (var i = 0; i < results.rows.length; i++) { 
         console.log(results.rows.item(i)); 
         var row = results.rows.item(i); 
         if (row.sql != null && row.sql.indexOf("CREATE ") != -1) { 
          var objectType = row.sql.replace("CREATE ", "").split(/ |\(/)[0]; 
          if (row.sql.indexOf("CREATE " + objectType + " ") != -1 && row.sql.indexOf("__") == -1) { 
           var objectName = row.sql.replace("CREATE " + objectType + " ", "").split(/ |\(/)[0]; 
           sqlStatements.push('/* ' + count + ' */ "DROP ' + objectType + ' IF EXISTS ' + objectName + '"'); 
           count++; 
          } 
          if (row.sql != null && row.sql.indexOf("__") == -1) { 
           sqlStatements.push('/* ' + count + ' */ "' + row.sql.replace(/(\r\n|\n|\r)/gm, " ") + '"'); 
           count++; 
          } 

         } 
        } 
       } 

       for (var j = 0; j < sqlStatements.length; j++) { 
        if (sqlStatements[j] != null) { 
         looongSQL += sqlStatements[j] + ',\r\n'; 
        } 
       } 

       transaction.executeSql("SELECT tbl_name from sqlite_master WHERE type = 'table'", [], 
        function (transaction, res) { 
         var sqlTables = []; 
         for (var k = 0; k < res.rows.length; k++) { 
          if (res.rows.item(k).tbl_name.indexOf("__") == -1) { 
           sqlTables.push(res.rows.item(k).tbl_name); 
          } 
         } 
         x({ 
          sqlTables: sqlTables, 
          n: 0, 
          count: count 
         }); 
        }); 

      } 
     ); 
    }); 
}; 
+0

Czy możesz dodać argumenty, dlaczego twoje rozwiązanie jest "najwygodniejsze"? – Xan

+0

wkleiłeś skrypt w narzędziach debuggera chrome wywołanie c(), a otrzymasz plik. Nie może być łatwiej, prawda? –

+1

Uncaught ReferenceError: onTheMove nie jest zdefiniowany –