javascript - Web SQL hämta kolumnlista från tabell
Jag försöker få kolumnlistan från Web SQL (Chrome lokal databas). Ett av besluten är att hämta information från sqlite_master
SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "'+name+'";
Till exempel får jag detta resultat
CREATE TABLE table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT,
number INTEGER unique, description TEXT, password TEXT, url TEXT )
Så hjälp mig skriva regex för att få kolumnnamn, eller, kanske, visa mig ett annat enkelt sätt att få kolumnnamn.
PS. Jag vill inte göra select * from table... för att få kolumnnamn. Jag tycker att detta är en dålig lösning..
Svar #1
För att få kolumnerna i en tabell, kör PRAGMA table_info(table_name):
PRAGMA table_info()
Returnera en enskild rad för varje kolumn i den namngivna tabellen. Kolumnerna i den returnerade datasatsen är:
- cid: Kolumn-ID (numrerad från vänster till höger, börjar på 0)
- namn: Kolumnnamn
- typ: Kolumndefinitionstyp.
- notnull: Sant om '
NOT NULL' är en del av kolumndefinitionen- dflt_value: Standardvärdet för kolumnen, om det finns.
Tyvärr blockerar Chrome alla PRAGMA, så detta fungerar inte i WebSQL.
I WebSQL kan du endast komma åt tabeller som skapats av din app, så du bör bara komma ihåg vilka kolumner dina tabeller har.
Alternativt kan du bara försöka läsa från tabellen:
SELECT * FROM table_name LIMIT 1
Med LIMIT-satsen blir detta mycket effektivt eftersom du bara läser några slumpmässiga poster. (Utom om du har någon väldigt stor blob i den posten.)
Svar #2
I Chrome fungerade detta för mig med html5sql. Jag gjorde också en codepen som använder ren HTML5 med en cool Promise-baserad frågefunktion, här.
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);
}
Detta kommer att träffa din (error, tables)-återuppringning så här:
[{
"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"
]
}]
Observera fields-sektionen. Detta fungerar, även om det inte finns några poster. Regex-/stränganalysen kan förmodligen behöva förbättras, och du skulle förmodligen kunna hämta typinformation med den också, men detta verkade fungera för alla mina användningsfall. En alternativ metod när du känner till fältnamnen, i SQL:
SELECT TYPEOF(id) as id, TYPEOF(firstName) AS firstName , TYPEOF(lastName) AS lastName, TYPEOF(email) AS email, TYPEOF(created) AS created FROM Users;
