2009-05-30 14 views
35

किक्स के लिए मैं एक "स्कीमा दस्तावेज़" टूल लिख रहा हूं जो डेटाबेस में तालिकाओं और रिश्तों का विवरण उत्पन्न करता है। मैं वर्तमान में SQLite के साथ काम करने के लिए इसे shimming कर रहा हूँ।रिक्त तालिका में SQLite कॉलम नाम खोजें

मैं sqlite_master मेज पर एक प्रश्न के माध्यम से एक SQLite डेटाबेस में सभी तालिकाओं के नाम निकालने के लिए प्रबंधित किया है। प्रत्येक तालिका नाम के लिए, मैं तो एक साधारण

select * from <table name> 

क्वेरी बंद आग, तो sqlite3_column_count() और sqlite3_column_name() API का उपयोग स्तंभ नाम है, जो मैं आगे sqlite3_table_column_metadata() को खिलाने के लिए अतिरिक्त जानकारी प्राप्त करने के लिए इकट्ठा करने के लिए। काफी सरल, सही?

समस्या यह है कि यह केवल उन तालिकाओं के लिए काम करता है जो खाली नहीं हैं। यही है, sqlite_column_*() एपीआई केवल मान्य हैं अगर sqlite_step()SQLITE_ROW लौटा दिया गया है, जो खाली सारणी के मामले में नहीं है।

तो सवाल यह है कि, मैं खाली तालिकाओं के लिए कॉलम नाम कैसे खोज सकता हूं? या, आमतौर पर, SQLite में इस प्रकार की स्कीमा जानकारी प्राप्त करने का एक बेहतर तरीका है?

मुझे लगता है कि इस जानकारी वाले कहीं और छिपी हुई sqlite_xxx तालिका होनी चाहिए, लेकिन अब तक इसे खोजने में सक्षम नहीं है।

+2

सभी को धन्यवाद। मैंने गलती से सोचा कि PRAGMA इंटरफ़ेस केवल 'sqlite3' कमांड लाइन क्लाइंट के लिए था। –

उत्तर

61
sqlite> .header on 
sqlite> .mode column 
sqlite> create table ABC(A TEXT, B VARCHAR); 
sqlite> pragma table_info(ABC); 
cid   name  type  notnull  dflt_value pk 
---------- ---------- ---------- ---------- ---------- ---------- 
0   A   TEXT  0      0 
1   B   VARCHAR  0      0 
+4

ऐसा लगता है कि कमांड लाइन पर काम करता है - मैं प्रोग्रामिंग के समान प्रभाव कैसे प्राप्त कर सकता हूं? –

+4

@pragmanatu आपका उपनाम एक संयोग है? :) –

+0

धन्यवाद - यह एक आकर्षण की तरह काम करता है और मैं जो कर रहा था उससे कहीं अधिक सरल है। चीयर्स! –

3

PRAGMA बयान @pragmanatu ने सुझाव दिया है, भी किसी भी कार्यक्रम इंटरफ़ेस के माध्यम से ठीक काम करता है। वैकल्पिक रूप से, sqlsqlite_master के कॉलम में SQL कथन CREATE TABLE &c &c है जो तालिका का वर्णन करता है (लेकिन, आपको इसे पार्स करना होगा, इसलिए मुझे लगता है कि PRAGMA table_info और अधिक है ... व्यावहारिक ;-)।

10

क्वेरी निष्पादित करें:

PRAGMA table_info(your_table_name); 

Documentation

3

इस क्वेरी निष्पादित

select * from (select "") left join my_table_to_test b on -1 = b.rowid; 

आप एचटीएमएल 5 SQLite में काम नहीं करता online sqlite engine

+0

मैंने कोशिश की, यह काम नहीं किया। – xApple

+0

इस तरह से सबसे अच्छा है!यदि आप 'पंक्ति' कॉलम का नाम नहीं जानते हैं तो मैं सुझाव देता हूं: 'चयन टी। * से (चयन 1) बाएं जॉइन टेबल AS t LIMIT 1' – conca

4

PRAGMA table_info(your_table_name); पर यह कोशिश कर सकते हैं।

यहां एक छोटा एचटीएमएल 5 SQLite जावास्क्रिप्ट टुकड़ा जो भी अपने खाली अगर your_table_name से स्तंभ नाम हो जाता है। उम्मीद है कि यह सहायक है।

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) { 
    var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); 
    var columnNames = []; 
    for(i in columnParts) { 
    if(typeof columnParts[i] === 'string') 
     columnNames.push(columnParts[i].split(" ")[0]); 
    } 
    console.log(columnNames); 
    ///// Your code which uses the columnNames; 
}); 
+0

ऐसा लगता है कि आपकी तालिका में एक से अधिक कॉलम हैं, कॉलम 2 - एन whitespace अग्रणी के कारण संसाधित नहीं है। इसे स्ट्रिंग पर 'trim() 'फ़ंक्शन को कॉल करके तय किया जा सकता है (या इसे अपने ब्राउज़र के लिए कार्यान्वित करना जो अभी तक' trim() 'का समर्थन नहीं करता है)। किसी आईडी और नाम फ़ील्ड के साथ तालिका (व्यक्ति) पर उपर्युक्त फ़ंक्शन को कॉल करना '[" id "," "]' 'देता है। – legacybass

0

आप SQLite 3.8.3 या बाद में मुकदमा कर रहे हैं (खंड के साथ समर्थन करता है), इस पुनरावर्ती पूछताछ बुनियादी तालिकाओं के लिए काम करना चाहिए। सीटीएएस पर, वाईएमएमवी।

WITH 
    Recordify(tbl_name, Ordinal, Clause, Sql) 
AS 
    (
    SELECT 
     tbl_name, 
     0, 

     '', 
     Sql 
    FROM 
     (
     SELECT 
      tbl_name, 
      substr 
      (
      Sql, 
      instr(Sql, '(') + 1, 
      length(Sql) - instr(Sql, '(') - 1 
      ) || ',' Sql 
     FROM 
      sqlite_master 
     WHERE 
      type = 'table' 
     ) 
    UNION ALL 
    SELECT 
     tbl_name, 
     Ordinal + 1, 
     trim(substr(Sql, 1, instr(Sql, ',') - 1)), 
     substr(Sql, instr(Sql, ',') + 1) 
    FROM 
     Recordify 
    WHERE 
     Sql > '' 
     AND lower(trim(Sql)) NOT LIKE 'check%' 
     AND lower(trim(Sql)) NOT LIKE 'unique%' 
     AND lower(trim(Sql)) NOT LIKE 'primary%' 
     AND lower(trim(Sql)) NOT LIKE 'foreign%' 
     AND lower(trim(Sql)) NOT LIKE 'constraint%' 
    ), 
    -- Added to make querying a subset easier. 
    Listing(tbl_name, Ordinal, Name, Constraints) 
AS 
    (
    SELECT 
     tbl_name, 
     Ordinal, 
     substr(Clause, 1, instr(Clause, ' ') - 1), 
     trim(substr(Clause, instr(Clause, ' ') + 1)) 
    FROM 
     Recordify 
    WHERE 
     Ordinal > 0 
    ) 
SELECT 
    tbl_name, 
    Ordinal, 
    Name, 
    Constraints 
FROM 
    Listing 
ORDER BY 
    tbl_name, 
    lower(Name); 
संबंधित मुद्दे