2010-10-16 4 views
8

Я работаю над расширением Chrome, которое использует WebSQL для хранения исторических данных. Будучи WebSQL, БД хранится на клиенте.Как экспортировать (дамп) данные WebSQL

Я хотел бы добавить опцию для экспорта/импорта таких данных, чтобы пользователь мог обмениваться/использовать эти данные с другими пользователями или с другими ПК.

Это мои первые шаги в базе данных только для клиентов, поэтому мне интересно, как это сделать. Я думал преобразовать БД в огромную строку json, которую пользователь может скопировать/вставить, но не выглядит очень удобным.

Есть ли лучшее решение?

ответ

15

У меня есть одно решение для дампа стола, работающее на HTML5 database client Я написал несколько дней назад.

Проверьте http://html5db.desalasworks.com/script.js и прокрутите страницу до SqlClient.exportTable, это пример, который необходимо расширить, чтобы охватить всю базу данных.

Шаги:

Шаг 1: Создание схемы:

SELECT sql FROM sqlite_master 

Шаг 2: Получение списка таблиц:

SELECT tbl_name from sqlite_master WHERE type = 'table' 

Шаг 3: Цикл по каждому из них и создать сценарий INSERT с результатами

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

Надеюсь, это полезно.

UPDATE января 2016 - ВЕСЬ DB EXPORT

У меня websqldump библиотеку JS, которые вы можете загрузить с GitHub, а также.

Этот номер будет экспортировать всю базу данных. Проверьте код на:

https://github.com/sdesalas/websqldump

Использование следующим

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

Выглядит здорово, будет пытаться его в ближайшее время, спасибо – Omiod

+0

Ok. Поэтому вы намерены импортировать базу данных, просто просматривая каждую строку экспорта и db.executeSQL. Красиво сделано. Но было бы разумно предложить CREATE [база данных | table] ЕСЛИ НЕ СУЩЕСТВУЕТСЯ там, перед тем, как возникли проблемы с вставками. –

+0

Где находится Шаг 1? –

-1

Не самый элегантный способ, все же наиболее удобным.
Просто вставьте скрипт в хром-инструменты отладчика, затем вызовите c(), и вы должны получить файл.

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

      } 
     ); 
    }); 
}; 

Другой вариант, который экспортирует его в формате 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

Можете ли вы добавить аргументы о том, почему ваше решение «наиболее удобно»? – Xan

+0

вы вставляете скрипт в хром-инструменты отладчика call c(), и вы получаете файл. Не может быть легче, не так ли? –

+1

Uncaught ReferenceError: onTheMove не определен –

Смежные вопросы