2010-10-16 24 views
8

estoy trabajando en una extensión de Chrome que utiliza WebSQL para almacenar datos históricos. Ser WebSQL, la base de datos se almacena en el cliente.Cómo exportar (volcado de datos) WebSQL

Me gustaría añadir una opción para exportar/importar estos datos de manera que el usuario puede compartir/utilizar estos datos con otros usuarios, o con otros ordenadores.

Estos son mis primeros pasos en una base de datos de sólo cliente, por lo que se preguntan cómo hacer esto. pensaba para convertir la base de datos a una gran json cadena que el usuario puede copiar/pegar, pero no se ve muy fácil de usar.

¿Hay alguna solución mejor?

Respuesta

15

me dieron una solución volcado de tabla única que trabaja en un HTML5 database client que escribí hace unos días.

Consulte http://html5db.desalasworks.com/script.js y desplácese hacia abajo a SqlClient.exportTable, este tiene un ejemplo que debe expandirse para abarcar toda la base de datos.

Los pasos son:

Paso 1: Crear el esquema:

SELECT sql FROM sqlite_master 

Paso 2: Obtener una lista de tablas:

SELECT tbl_name from sqlite_master WHERE type = 'table' 

Paso 3: Bucle a través de cada una de ellas y crear un script INSERT con los resultados

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(",") + ")"; 
      } 
     } 
    } 
); 

Espero que esto sea útil.

ACTUALIZACIÓN-ENE-2016 - TODA DB EXPORTACIÓN

Tengo una biblioteca websqldump JS que se puede descargar desde GitHub también.

Este exportará la base de datos completa . Mira el código en:

https://github.com/sdesalas/websqldump

Uso de la siguiente manera

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

ve muy bien, intentará pronto, gracias – Omiod

+0

Ok. Por lo tanto, su intención es importar la base de datos, simplemente ejecutar a través de cada línea de la exportación y db.executeSQL. Bien hecho. Pero sería prudente ofrecer CREATE [base de datos | tabla] SI NO EXISTE allí antes de la ráfaga de instrucciones de inserción. –

+0

¿Dónde juega el Paso 1? –

-1

No es la forma más elegante y más conveniente.
Simplemente pegue la secuencia de comandos en las herramientas de depuración de Chrome y luego llame a c(), y debe obtener el archivo.

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

      } 
     ); 
    }); 
}; 

Otra versión que lo exporta como 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

¿Puede agregar argumentos sobre por qué su solución es "más conveniente"? – Xan

+0

pega la secuencia de comandos en las herramientas de depuración de Chrome llame a c(), y obtendrá el archivo. No puede ser más fácil ¿verdad? –

+1

Uncaught ReferenceError: onTheMove no está definido –

Cuestiones relacionadas