2010-10-16 26 views
8

Geçmiş verileri depolamak için WebSQL kullanan bir Chrome Uzantısı üzerinde çalışıyorum. WebSQL olan DB, istemcide depolanır.WebSQL verileri dışarı aktarma (dökümü)

Bu verileri dışarı aktarmak/içeri aktarmak için bir seçenek eklemek istiyorum, böylece kullanıcı bu verileri diğer kullanıcılarla veya başka bilgisayarlarla paylaşabilir/kullanabilir.

Bunlar, yalnızca istemci veritabanında ilk adımlardır, bu yüzden nasıl yapılacağını merak ediyorum. DB'yi, kullanıcının kopyalayıp yapıştırabildiği, ancak çok kullanıcı dostu görünmeyen büyük bir json dizgisine dönüştürmeyi düşünüyordum.

Daha iyi bir çözüm var mı?

cevap

15

Bir kaç gün önce yazdığım bir HTML5 database client üzerinde çalışan tek bir tablo döküm çözümüm var.

http://html5db.desalasworks.com/script.js'a bakın ve SqlClient.exportTable öğesine kaydırın, bu, tüm veritabanını kapsayacak şekilde genişletilmesi gereken bir örneğe sahiptir.

adımlar şunlardır:

Adım 1:

SELECT sql FROM sqlite_master 

Adım 2: şeması oluştur bunların her birinin içinden Döngü:

SELECT tbl_name from sqlite_master WHERE type = 'table' 

Adım 3: tabloların bir listesini alın ve sonuçları

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(",") + ")"; 
      } 
     } 
    } 
); 
ile bir INSERT komut dosyası oluşturun.

Umarım bu yararlıdır.

GÜNCELLEME Ocak 2016 - Sana yanı github indirebileceğiniz bir JS websqldump kütüphanesi var

BÜTÜN DB İHRACAT.

Bu, tüm veritabanını dışa aktarır. Henüz

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

harika görünüyor JSON olarak ihraç başka bir sürümü, teşekkür – Omiod

+0

Tamam, yakında çalışacağız. Dolayısıyla, amacınız veritabanını içe aktarmak, yalnızca her bir dışa aktarma hattını ve db.executeSQL'i çalıştırmaktır. Güzel bitti. Ama CREATE önermek ihtiyatlı olurdu [veritabanı | tablo] Ekleme deyimlerinin çalkantısından önce orada OLMAYINIZ. –

+0

1. Adım nerede oynuyor? –

-1

değil en zarif yolu, en uygun aşağıdaki gibi

https://github.com/sdesalas/websqldump

Kullanımı: kod göz atın.
Yalnızca komut dosyasını krom hata ayıklayıcı araçlarına yapıştırın, ardından c() öğesini çağırın ve dosyayı almalısınız.

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 
         }); 
        }); 

      } 
     ); 
    }); 
}; 

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

Çözümünüzün neden "en uygun" olduğu konusunda argümanlar ekleyebilir misiniz? – Xan

+0

Eğer krom ayıklayıcı araçlarında komut c() diyoruz yapıştırın ve dosyayı olsun. Daha kolay olamaz mı? –

+1

Yakalanmamış ReferenceError: onTheMove tanımlı değil –

İlgili konular