2013-03-05 13 views
4
獲取列列表

我嘗試從Web sql(Chrome本地數據庫)獲取列列表。的決定 Оne - 得到SQLITE_MASTERWeb SQL從表

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 ...獲取列名稱。我認爲這是壞的解決方案..

+0

選擇的名字從那裏SYS.COLUMNS =的object_id OBJECT_ID(N'table_name') – 2013-03-05 10:37:32

+1

你確定這個查詢網頁的SQL? – MikeLP 2013-03-05 11:08:08

+0

不,我不確定,因爲這是爲SQL服務器.. – 2013-03-05 11:16:05

回答

4

爲了得到一個表的列,執行PRAGMA table_info(table_name)

PRAGMA table_info()

返回一行的命名錶中的每一列。 返回的數據集的列是:

  • CID:色譜柱內徑(編號從左至右,從0開始)
  • 名:列名
  • 類型:柱聲明類型。
  • notnull:如果'NOT NULL'是列聲明的一部分,則返回true
  • dflt_value:列的缺省值(如果有)。

不幸的是,Chrome會封鎖所有PRAGMA S,所以這不會的WebSQL工作。


在WebSQL中,您只能訪問由您的應用程序創建的表,因此您應該只記住表中有哪些列。


或者,你可以只是嘗試從表中讀取:

SELECT * FROM table_name LIMIT 1 

隨着LIMIT條款,因爲你只讀了一些隨機記錄,這將是非常有效的。 (除非你在該記錄中有一些非常大的斑點。)

+3

PRAGMA table_info(my_table) 無法準備關於SELECT * FROM table_name的語句(23未授權) – MikeLP 2013-03-05 12:48:02

+4

LIMIT 1; 問題在表格爲空時開始。 – MikeLP 2013-03-05 15:07:48

+0

在WebSQL中,您只能訪問由您的應用程序創建的表格,因此您應該只記住表格具有哪些列。 ---------------------------------- 是的,我明白。我編寫自己的小型ORM庫。我做,該模型自動創建的表和刪除或添加列,如果我改變模型的屬性。現在我重構我的代碼並尋求一個更優雅的解決方案 – MikeLP 2013-03-05 15:13:19

1

在鉻,這對我工作與html5sql。我還製作了一個使用純HTML5和基於Promise的酷查詢函數here的codepen。

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;