5

我尝试从 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 ) 

因此,请帮助我编写用于获取列名的正则表达式,或者,也许,向我展示另一种获取列名的简单方法。

PS。我不会这样做select * from table......获取列名。我认为这是不好的解决方案..

4

2 回答 2

4

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

PRAGMA table_info()

为命名表的每一列返回一行。返回数据集的列是:

  • cid:列id(从左到右编号,从0开始)
  • 名称:列名
  • type:列声明类型。
  • notnull:如果“ NOT NULL”是列声明的一部分,则为真
  • dflt_value:列的默认值(如果有)。

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


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


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

SELECT * FROM table_name LIMIT 1

使用该LIMIT子句,这将非常有效,因为您只读取了一些随机记录。(除非您在该记录中有一些非常大的斑点。)

于 2013-03-05T12:29:35.193 回答
2

在 chrome 中,这对我有用 html5sql。我还制作了一个代码笔,它使用纯 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;
于 2014-11-24T22:53:54.893 回答