【问题标题】:Web SQL get column list from tableWeb SQL 从表中获取列列表
【发布时间】:2013-02-19 17:09:32
【问题描述】:

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

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

附言。我不会为了获取列名而使用select * from table...。我认为这是不好的解决方案..

【问题讨论】:

  • 从 sys.columns 中选择名称,其中 object_id = object_id(N'table_name')
  • 你确定这个查询是针对 web sql 的吗?
  • 不,我不确定,因为这是用于 sql server..
  • 要获得表格创建语法(用于查看列,但不能用作代码库的一部分),您可以执行SELECT sql FROM sqlite_master WHERE tbl_name = 'your_table_name' AND type = 'table'

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


【解决方案1】:

要获取表的列,请执行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 子句,这将非常有效,因为您只读取一些随机记录。 (除非您在该记录中有一些非常大的斑点。)

【讨论】:

  • PRAGMA table_info(my_table) 无法准备语句(23 未授权)
  • 关于 SELECT * FROM table_name LIMIT 1;当表为空时问题开始。
  • 在 WebSQL 中,您只能访问由您的应用程序创建的表,因此您应该记住您的表有哪些列。 - - - - - - - - - - - - - - - - - 是的我明白。我编写了自己的小型 ORM 库。如果我更改模型的属性,我会创建由模型自动创建的表并删除或添加列。现在我重构我的代码并寻求更优雅的解决方案
  • you should just remember which columns your tables have. 不可接受。我的网络应用程序适用于我的整个子域。这完全破坏了我用于浏览表的“通用 SQL 表”应用程序,该应用程序 需要 能够自省在同一域中创建的另一个应用程序的表。 +1 虽然回答我的 WTF Chrome 问题给了我“未经授权”的垃圾。
【解决方案2】:

在 chrome 中,这对我有用 html5sql。我还制作了一个 codepen,它使用纯 HTML5 和一个很酷的基于 Promise 的查询功能,here

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多