javascript - Web SQL hent kolonneliste fra tabell
Jeg prøver å hente kolonneliste fra Web SQL (Chrome lokal database). En av løsningene - hente info fra sqlite_master
SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "'+name+'";
For eksempel får jeg dette resultatet
CREATE TABLE table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT,
number INTEGER unique, description TEXT, password TEXT, url TEXT )
Så hjelp meg med å skrive regex for å få kolonnenavn, eller kanskje, vis meg en annen enkel måte å få kolonnenavn på.
PS. Jeg vil ikke bruke select * from table... for å få kolonnenavn. Jeg tror dette er en dårlig løsning..
Svar #1
For å få kolonnene i en tabell, kjør PRAGMA table_info(table_name):
PRAGMA table_info()
Returner en enkelt rad for hver kolonne i den navngitte tabellen. Kolonnene i det returnerte datasettet er:
- cid: Kolonne-ID (nummerert fra venstre mot høyre, med start på 0)
- navn: Kolonnenavn
- type: Kolonnedeklarasjonstype.
- notnull: Sant hvis '
NOT NULL' er en del av kolonnedeklarasjonen- dflt_value: Standardverdien for kolonnen, om det finnes noen.
Dessverre blokkerer Chrome alle PRAGMA-er, så dette fungerer ikke i WebSQL.
I WebSQL kan du bare få tilgang til tabeller som ble opprettet av appen din, så du bør bare huske hvilke kolonner tabellene dine har.
Alternativt kan du bare prøve å lese fra tabellen:
SELECT * FROM table_name LIMIT 1
Med LIMIT-klausulen vil dette være veldig effektivt fordi du bare leser noen tilfeldige poster. (Bortsett fra hvis du har en veldig stor blob i den posten.)
Svar #2
I Chrome fungerte dette for meg med html5sql. Jeg laget også en CodePen som bruker ren HTML5 med en kul forespørselsfunksjon basert på Promise, her.
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);
}
Dette vil treffe din (error, tables) tilbakeringing slik:
[{
"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"
]
}]
Merk fields-delen. Dette fungerer, selv om det ikke finnes noen poster. Regex-/string-parsingen kunne sannsynligvis trengt noen forbedringer, og du kunne sannsynligvis hente typeinformasjon med den også, men dette syntes å fungere med alle mine brukstilfeller. En alternativ metode når du kjenner feltnavnene, 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;
