我尝试从Web sql(Chrome本地数据库)获取列列表。 Оne的决定 - 从sqlite_master获取信息
SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "'+name+'";
例如,我得到了这个结果
CREATE TABLE table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT,
number INTEGER unique, description TEXT, password TEXT, url TEXT )
所以帮我写regex获取列名,或者,或许,给我看另一个简单的方法获取列名。
PS。我不想做select * from table
...获取列名。我认为这是一个糟糕的解决方案..
答案 0 :(得分:4)
要获取表格的列,请执行PRAGMA table_info(table_name)
:
为指定表的每一列返回一行。的列 返回的数据集是:
- cid:列ID(从左到右编号,从0开始)
- name:列名
- type:列声明类型。
- notnull:如果“
NOT NULL
”是列声明的一部分,则为True- dflt_value:列的默认值(如果有)。
不幸的是,Chrome会阻止所有PRAGMA
,因此这在WebSQL中无效。
在WebSQL中,您只能访问应用程序创建的表格,因此您应该只记住表格中的哪些列。
或者,您可以尝试阅读表格:
SELECT * FROM table_name LIMIT 1
使用LIMIT
子句,这将非常有效,因为您只读取了一些随机记录。 (除非你在该记录中有一些非常大的blob。)
答案 1 :(得分:2)
在Chrome中,html5sql对我有用。我还制作了一个使用pure-HTML5和一个很酷的基于Promise的查询函数{4}的编解码器。
function getDB(cb){
html5sql.process("SELECT * FROM sqlite_master WHERE name NOT LIKE 'sqlite\\_%' escape '\\' AND name NOT LIKE '\\_%' escape '\\'", function(txTables, rsTables, tables){
if (!tables.length) return cb(null, []);
tables.forEach(function(table){
var s = table.sql.split(',');
s[0] = s[0].replace(new RegExp('create\\s+table\\s+' + table.name + '\\s*\\(', 'i'),'');
table.fields = s.map(function(i){
return i.trim().split(/\s/).shift();
})
.filter(function(i){
return (i.indexOf(')') === -1)
})
});
cb(null, tables)
}, cb);
}
这会点击你的(error, tables)
回调:
[{
"type": "table",
"name": "Users",
"tbl_name": "Users",
"rootpage": 6,
"sql": "CREATE TABLE Users(\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n firstName VARCHAR(255),\n lastName VARCHAR(255),\n email VARCHAR(255),\n created TIMESTAMP DEFAULT (DATETIME('now','localtime'))\n)",
"fields": [
"id",
"firstName",
"lastName",
"email",
"created"
]
}]
请注意fields
部分。即使没有记录,这也有效。正则表达式/字符串解析可能会使用一些改进,你也可以用它来获取type-info,但这似乎适用于我的所有用例。在SQL中知道字段名后的另一种方法:
SELECT TYPEOF(id) as id, TYPEOF(firstName) AS firstName , TYPEOF(lastName) AS lastName, TYPEOF(email) AS email, TYPEOF(created) AS created FROM Users;