使用 sql.js 在 javascript 中加载 sqlite 数据库
loading sqlite database in javascript with sql.js
有人可以提供一个不使用 node.js.
加载现有 sqlite 数据库的简单完整示例吗?
假设 sql 数据库与 index.html
位于同一位置
示例:
我试过这个例子,但是 "contents" 是未定义的。另外,我不知道如何访问 "contents" 中的数据?我真的可以使用一个完整的例子。
var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/database.sqlite', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
var uInt8Array = new Uint8Array(this.response);
var db = new SQL.Database(uInt8Array);
var contents = db.exec("SELECT * FROM my_table");
// contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]
};
xhr.send();
我知道这已经过时了,但是我的朋友,给你吧。你就在那里,只是一点点调整。我不确定您是否正在使用 GitHub 中的 SQL.js 库,但请这样做,因为它解决了很多浏览器安全问题,并使 SQL 方面的事情更容易在大脑中进行.
如果您没有创建源代码或有一些 UTF 问题,将抛出异常。我在一个晚上写了这篇文章,所以我没有 运行 多个函数,但我假设需要回调来防止异步过程中的 SQLite 问题。这是我第一次使用 SQLite 或 SQL.js 库,所以我还不知道。
重要!
这只是一个本地解决方案,它比高中更衣室有更多明显的漏洞。绝不能将其用于暴露在互联网上的任何东西。
这都是在我的 class 的顶部声明的,而不是在函数内。这是有目的的,因为我 运行 多个查询并且不希望 loading/unloading 和 object 的开销太大。
请注意源上的完全限定路径...相对路径对我不起作用。
var xhrLocal = new XMLHttpRequest();
xhrLocal.open('GET', 'http://localhost/mp3/data/media.sqlite', true);
xhrLocal.responseType = 'arraybuffer';
var localData;
xhrLocal.onload = function(e) {
var uInt8Array = new Uint8Array(this.response);
localData = new SQL.Database(uInt8Array);
};
xhrLocal.send();
此时您已将数据库加载到名为 localData 的 object 中,您可以从任何地方查询它。这是我为获取流派信息而写的查询。
function FillGenreLists() {
var sqlSel = 'SELECT * FROM GenreData';
var data = localData.exec(sqlSel);
var output = [];
$.each(data[0].values, function(key, value)
{
output.push('<option value="'+ value[0] +'">'+ value[1] +'</option>');
});
$('#selGenres').html(output.join(''));
}
SQL 调用的输出通常是一个数组数组,不用担心更改它,只需将 SQL 调用的结果输出到控制台并注意 return 字段和值,从那里只需使用 $.each 即可。
这是另一个查询,前提相同但目标是创建一个 SQL 语句以推送到 MS SQL 服务器并获取有关我本地 [=39= 中的艺术家的 FreeDB 数据].
注意:这一切都可以通过查询我的本地 sqlite table,生成 sql 并将其推送到 MS,在一次调用中完成SQL 使用不同的 conn 或通过使用通用 proc 甚至更好,但现在让我们保持简单。
function PrepareMSSQLFilteredFreeDBTables(StartLetter, EndLetter, TempTableName) {
var sqlSel = "SELECT * FROM ArtistData WHERE ArtistText BETWEEN '" + StartLetter + "' AND '" + EndLetter + "' ORDER BY ArtistText";
var data = localData.exec(sqlSel);
$('.array-cols').append('SELECT * INTO ' + TempTableName + ' FROM FreeDB WHERE DARTIST IN (');
var iLen = (data[0].values.length - 1);
$.each(data[0].values, function(a, b) {
var sRes;
if (a === iLen) { sRes = "'" + b[1].replace("'", "''") + "')"; }
else { sRes = "'" + b[1].replace("'", "''") + "', "; }
$('.array-cols').append(sRes);
});
}
有人可以提供一个不使用 node.js.
加载现有 sqlite 数据库的简单完整示例吗?假设 sql 数据库与 index.html
位于同一位置示例:
我试过这个例子,但是 "contents" 是未定义的。另外,我不知道如何访问 "contents" 中的数据?我真的可以使用一个完整的例子。
var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/database.sqlite', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
var uInt8Array = new Uint8Array(this.response);
var db = new SQL.Database(uInt8Array);
var contents = db.exec("SELECT * FROM my_table");
// contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]
};
xhr.send();
我知道这已经过时了,但是我的朋友,给你吧。你就在那里,只是一点点调整。我不确定您是否正在使用 GitHub 中的 SQL.js 库,但请这样做,因为它解决了很多浏览器安全问题,并使 SQL 方面的事情更容易在大脑中进行.
如果您没有创建源代码或有一些 UTF 问题,将抛出异常。我在一个晚上写了这篇文章,所以我没有 运行 多个函数,但我假设需要回调来防止异步过程中的 SQLite 问题。这是我第一次使用 SQLite 或 SQL.js 库,所以我还不知道。
重要! 这只是一个本地解决方案,它比高中更衣室有更多明显的漏洞。绝不能将其用于暴露在互联网上的任何东西。
这都是在我的 class 的顶部声明的,而不是在函数内。这是有目的的,因为我 运行 多个查询并且不希望 loading/unloading 和 object 的开销太大。
请注意源上的完全限定路径...相对路径对我不起作用。
var xhrLocal = new XMLHttpRequest();
xhrLocal.open('GET', 'http://localhost/mp3/data/media.sqlite', true);
xhrLocal.responseType = 'arraybuffer';
var localData;
xhrLocal.onload = function(e) {
var uInt8Array = new Uint8Array(this.response);
localData = new SQL.Database(uInt8Array);
};
xhrLocal.send();
此时您已将数据库加载到名为 localData 的 object 中,您可以从任何地方查询它。这是我为获取流派信息而写的查询。
function FillGenreLists() {
var sqlSel = 'SELECT * FROM GenreData';
var data = localData.exec(sqlSel);
var output = [];
$.each(data[0].values, function(key, value)
{
output.push('<option value="'+ value[0] +'">'+ value[1] +'</option>');
});
$('#selGenres').html(output.join(''));
}
SQL 调用的输出通常是一个数组数组,不用担心更改它,只需将 SQL 调用的结果输出到控制台并注意 return 字段和值,从那里只需使用 $.each 即可。
这是另一个查询,前提相同但目标是创建一个 SQL 语句以推送到 MS SQL 服务器并获取有关我本地 [=39= 中的艺术家的 FreeDB 数据].
注意:这一切都可以通过查询我的本地 sqlite table,生成 sql 并将其推送到 MS,在一次调用中完成SQL 使用不同的 conn 或通过使用通用 proc 甚至更好,但现在让我们保持简单。
function PrepareMSSQLFilteredFreeDBTables(StartLetter, EndLetter, TempTableName) {
var sqlSel = "SELECT * FROM ArtistData WHERE ArtistText BETWEEN '" + StartLetter + "' AND '" + EndLetter + "' ORDER BY ArtistText";
var data = localData.exec(sqlSel);
$('.array-cols').append('SELECT * INTO ' + TempTableName + ' FROM FreeDB WHERE DARTIST IN (');
var iLen = (data[0].values.length - 1);
$.each(data[0].values, function(a, b) {
var sRes;
if (a === iLen) { sRes = "'" + b[1].replace("'", "''") + "')"; }
else { sRes = "'" + b[1].replace("'", "''") + "', "; }
$('.array-cols').append(sRes);
});
}