Web SQL从表中获取列列表

Web SQL get column list from table

本文关键字:获取 列表 SQL Web      更新时间:2023-09-26

我尝试从Web sql (Chrome本地数据库)获取列列表。Оne of the decisions - get info from 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 ) 

帮我写一下获取列名的正则表达式,或者,告诉我另一种获取列名的简单方法。

p。我不想做select * from table…用于获取列名。我认为这是一个糟糕的解决方案。

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

杂注table_info ()

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

  • cid:列号(从左到右编号,从0开始)
  • name:列名
  • type:列声明类型
  • notnull:如果' NOT NULL '是列声明的一部分
  • dflt_value:列的默认值,如果有的话。

不幸的是,Chrome阻止所有的PRAGMA s,所以这在WebSQL中不起作用。


在WebSQL中,你只能访问由你的应用程序创建的表,所以你应该记住你的表有哪些列。


或者,您可以尝试从表中读取:

SELECT * FROM table_name LIMIT 1

对于LIMIT子句,这将是非常有效的,因为您只读取一些随机记录。(除非你的记录中有一些非常大的斑点)

在chrome中,这为我工作与html5sql。我还做了一个codepen,它使用纯html5,带有一个很酷的基于promise的查询功能,在这里。

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部分。这是有效的,即使没有记录。正则表达式/字符串解析可能需要一些改进,您也可能使用它来获取类型信息,但这似乎适用于我所有的用例。知道字段名后的另一种方法是SQL:

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