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;