【问题标题】:How to export (dump) WebSQL data如何导出(转储)WebSQL 数据
【发布时间】:2011-04-26 06:50:31
【问题描述】:

我正在开发一个使用 WebSQL 存储历史数据的 Chrome 扩展程序。 作为 WebSQL,数据库存储在客户端。

我想添加一个导出/导入此类数据的选项,以便用户可以与其他用户或其他 PC 共享/使用这些数据。

这是我在仅客户端数据库上的第一步,所以我想知道如何做到这一点。 我正在考虑将数据库转换为一个巨大的json 字符串,用户可以复制/粘贴该字符串,但看起来不太友好。

有没有更好的解决方案?

【问题讨论】:

    标签: json html sqlite google-chrome-extension export


    【解决方案1】:

    我在几天前写的 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(",") + ")";
                }
            }
        }
    );
    

    希望这是有用的。

    2016 年 1 月更新 - 整个数据库导出

    我有一个 JS websqldump 库,你也可以从 github 下载。

    这将导出整个数据库。查看以下代码:

    https://github.com/sdesalas/websqldump

    用法如下

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

    【讨论】:

    • 好的。因此,您的意图是导入数据库,只需运行 export 和 db.executeSQL 的每一行。做得很好。但是提供 CREATE [数据库 | table] IF NOT EXISTS 在插入语句之前。
    • 第 1 步在哪里播放?
    • 第 1 步将用于创建您的数据库,并且只会为您提供所需的 DDL(您只需立即执行一次 - 并且希望只需要执行一次,除非源数据库的定义变化);而第 3 步中的数据仅是 DML 语句。
    • @steven-de-salas 我有兴趣使用您的// Export current table as SQL script SqlClient.exportTable = function() {,但是我如何在我已经创建的带有数据的表上调用它?我用自己的设置初始化 SqlClient.dbInit = {。问候,s
    • 如果你能在你的回答中添加你将如何恢复备份,那就太好了......
    【解决方案2】:

    不是最优雅的方式,但最方便。
    只需将脚本粘贴到 chrome 调试器工具中,然后调用 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
                            });
                        });
    
                }
            );
        });
    };
    

    【讨论】:

    • 您能否添加论据说明您的解决方案为何“最方便”?
    • 您将脚本粘贴到 chrome 调试器工具调用 c() 中,然后获得文件。不能再简单点了吗?
    • 未捕获的 ReferenceError: onTheMove 未定义
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多