Web SQL从表中获取列列表

时间:2013-03-05 10:27:51

标签: javascript regex sqlite google-chrome web-sql

我尝试从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 ...获取列名。我认为这是一个糟糕的解决方案..

2 个答案:

答案 0 :(得分:4)

要获取表格的列,请执行PRAGMA table_info(table_name)

  

PRAGMA table_info()

     

为指定表的每一列返回一行。的列   返回的数据集是:

     
      
  • 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-in​​fo,但这似乎适用于我的所有用例。在SQL中知道字段名后的另一种方法:

SELECT TYPEOF(id) as id, TYPEOF(firstName) AS firstName , TYPEOF(lastName) AS lastName, TYPEOF(email) AS email, TYPEOF(created) AS created FROM Users;