2010-10-16 25 views
8

Tôi đang làm việc trên Tiện ích mở rộng của Chrome sử dụng WebSQL để lưu trữ dữ liệu lịch sử. Là WebSQL, DB được lưu trữ trên máy khách.Cách xuất (kết xuất) Dữ liệu WebSQL

Tôi muốn thêm tùy chọn xuất/nhập dữ liệu đó để người dùng có thể chia sẻ/sử dụng dữ liệu này với người dùng khác hoặc với các máy tính khác.

Đây là các bước đầu tiên của tôi trên cơ sở dữ liệu chỉ dành cho khách hàng, vì vậy tôi tự hỏi cách thực hiện việc này. Tôi đã suy nghĩ để chuyển đổi DB thành một chuỗi lớn json mà người dùng có thể sao chép/dán nhưng không trông rất thân thiện với người dùng.

Có giải pháp nào tốt hơn?

Trả lời

15

Tôi nhận được một giải pháp kết xuất bảng duy nhất hoạt động trên HTML5 database client Tôi đã viết cách đây vài ngày.

Kiểm tra http://html5db.desalasworks.com/script.js và cuộn xuống SqlClient.exportTable, ví dụ này cần được mở rộng để bao gồm toàn bộ cơ sở dữ liệu.

Các bước thực hiện:

Bước 1: Tạo giản đồ:

SELECT sql FROM sqlite_master 

Bước 2: Lấy một danh sách các bảng:

SELECT tbl_name from sqlite_master WHERE type = 'table' 

Bước 3: Lặp qua mỗi trong số họ và tạo tập lệnh INSERT với kết quả

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

Hy vọng điều này hữu ích.

CẬP NHẬT tháng 1 năm 2016 - WHOLE DB KHẨU

Tôi đã có một thư viện websqldump JS mà bạn có thể tải về từ github là tốt.

Điều này sẽ xuất cơ sở dữ liệu toàn bộ. Kiểm tra các mã trên:

https://github.com/sdesalas/websqldump

Cách sử dụng như sau

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

Trông tuyệt vời, sẽ thử nó sớm, nhờ – Omiod

+0

Ok. Vì vậy, ý định của bạn là nhập cơ sở dữ liệu, chỉ chạy qua từng dòng xuất và db.executeSQL. Thực hiện tốt. Nhưng sẽ thận trọng khi cung cấp CREATE [database | table] NẾU KHÔNG tồn tại trong đó trước khi các câu lệnh chèn. –

+0

Bước 1 chơi ở đâu? –

-1

Không cách thanh lịch nhất, nhưng thuận tiện nhất.
Chỉ cần dán tập lệnh trong công cụ trình gỡ lỗi chrome rồi gọi c() và bạn sẽ nhận được tệp.

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

      } 
     ); 
    }); 
}; 

Một phiên bản đó xuất khẩu nó như 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

Bạn có thể thêm đối số là tại sao giải pháp của bạn là "thuận tiện nhất"? – Xan

+0

bạn dán tập lệnh trong công cụ trình gỡ lỗi chrome gọi c() và bạn nhận tệp. Không thể nhận được bất kỳ dễ dàng hơn có thể nó? –

+1

Uncaught ReferenceError: onTheMove không được xác định –

Các vấn đề liên quan