javascript - Web SQL ile tablodan sütun listesini alma
Web SQL (Chrome yerel veritabanı) ile sütun listesi almaya çalışıyorum. Çözümlerden biri - bilgiyi sqlite_master'dan almak
SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "'+name+'";
Örneğin, bu sonucu alıyorum
CREATE TABLE table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT,
number INTEGER unique, description TEXT, password TEXT, url TEXT )
Böylece bana sütun adlarını almak için regex yazmamda yardım et, ya da belki bana sütun adlarını almanın başka basit bir yolunu göster.
Not: Sütun isimlerini almak için select * from table yapmak istemiyorum... Bence bu kötü bir çözüm.
Cevap #1
Bir tablonun sütunlarını almak için PRAGMA table_info(table_name) komutunu çalıştırın:
PRAGMA table_info()
Adı verilen tablonun her sütunu için tek bir satır döndürür. Döndürülen veri setinin sütunları şunlardır:
- cid: Sütun kimliği (soldan sağa numaralandırılır, 0’dan başlar)
- isim: Sütun adı
- type: Sütun deklarasyon türü.
- notnull: Sütun beyanının bir parçası olarak
NOT NULLvarsa True- dflt_value: Sütun için varsayılan değer, varsa.
Ne yazık ki, Chrome tüm PRAGMA bildirimlerini engelliyor, bu yüzden bu WebSQL'de çalışmıyor.
WebSQL'de, yalnızca uygulamanız tarafından oluşturulan tablolara erişebilirsiniz, bu yüzden tablolarınızın hangi sütunlara sahip olduğunu sadece hatırlamanız gerekir.
Alternatif olarak, sadece tablodan okumayı deneyebilirsiniz:
SELECT * FROM table_name LIMIT 1
LIMIT ifadesi ile, yalnızca bazı rastgele kayıtları okuduğunuz için bu çok verimli olacaktır. (O kayıtta çok büyük bir blob yoksa.)
Cevap #2
Chrome'da, bu benim için html5sql ile çalıştı. Ayrıca, saf HTML5 kullanan ve havalı Promise tabanlı bir sorgu fonksiyonuna sahip bir codepen de yaptım, burada.
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);
}
Bu, (error, tables) geri çağırmanızı şöyle etkileyecek:
[{
"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"
]
}]
Kod fields bölümüne dikkat edin. Bu çalışır, kayıtlar olmasa bile. Regex/string ayrıştırması muhtemelen biraz geliştirme gerektirebilir ve muhtemelen bununla tip bilgisini de alabilirsiniz, ama bu tüm kullanım durumlarımda işe yaradı. Alan adlarını bildiğinizde alternatif bir yöntem, SQL'de:
SELECT TYPEOF(id) as id, TYPEOF(firstName) AS firstName , TYPEOF(lastName) AS lastName, TYPEOF(email) AS email, TYPEOF(created) AS created FROM Users;
