Sqlite3 डेटाबेस पर कॉलम नामों की सूची कैसे प्राप्त करें?


373

मैं अपने iPhone ऐप को एक नए डेटाबेस संस्करण में स्थानांतरित करना चाहता हूं। चूंकि मेरे पास कुछ संस्करण सहेजे नहीं गए हैं, इसलिए मुझे यह जांचने की आवश्यकता है कि क्या कुछ कॉलम नाम मौजूद हैं।

यह Stackoverflow प्रविष्टि चयन करने का सुझाव देती है

SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'

और परिणाम पार्स।

क्या यह सामान्य तरीका है? वैकल्पिक?


के विशेष मामले के लिए SQLite.swift, को देखने के लिए इस सवाल-जवाब स्तंभ नाम की एक सरल सूची या के लिए यह एक माइग्रेशन मुद्दों के लिए।
सुरगाच

जवाबों:


586
PRAGMA table_info(table_name);

आपको सभी कॉलम नामों की एक सूची मिल जाएगी।


19
लेकिन आप उस तालिका से चयन नहीं कर सकते। यह सिर्फ सादा कष्टप्रद है। मैं कुछ इस तरह की कोशिश कर रहा हूँ ... लेकिन यह काम नहीं करताcreate temporary table TmpCols (cid integer, name text, type text, nn bit, dflt_value, pk bit); .mode insert TmpCols .output cols PRAGMA TABLE_INFO('yourtable'); .read cols .mode csv .output stdout
जेसन

बस इसे Android पर SQLiteDatabase के लिए कूट शब्दों में लिखें, लिखेंdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
SQLiteDatabase के Noumenon

4
यह व्यू के मामले में भी काम करेगा। PRAGMA table_info (View_Name); यह एक दृश्य के सभी स्तंभों को सूचीबद्ध करेगा

सिर्फ एक चुनिंदा बयान के अंत में "सीमा 0" को क्यों न चिपकाएं? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d कॉलम \ n", cols); for (int i = 0; i <cols; i ++) fprintf (stdout, "% d।% s \ n", i, sqlite3_column_name (stmt, i));
एरिक एरोनिटी

@ ErikAronesty सीमा 0 किसी भी कॉलम को वापस नहीं करती है।
विलियम एंट्रीकेन

213

यदि आपके पास sqlite डेटाबेस है, तो sqlite3 कमांड लाइन प्रोग्राम और इन कमांड्स का उपयोग करें:

डेटाबेस में सभी तालिकाओं को सूचीबद्ध करने के लिए:

.tables

किसी दिए गए स्कीमा को दिखाने के लिए tablename:

.schema tablename

8
हालांकि आउटपुट "पठनीय" नहीं है (शायद) यह is_much_ को याद रखने में आसान हैPRAGMA table_info(table_name);
निक टोमलिन

8
@NickTomlin दुर्भाग्य से, इस विधि के लिए sqlite3 कमांड लाइन प्रोग्राम की आवश्यकता होती है, क्योंकि डॉट कमांड मान्य SQL नहीं हैं।
माइकल

188

यदि तुम करो

.headers ON

आपको मनचाहा फल मिलेगा।


3
नीचे सामग्री के साथ हेडर संरेखित कैसे करें?
सनीडे


क्या यह एक खाली टेबल के साथ काम करना चाहिए? मैं अभी भी स्तंभ के नाम नहीं देख रहा हूं
क्रिस्टोफर पिस

कुछ कारणों से मुझे नहीं पता, PRAGMAविधि और .schemaविधि दोनों मेरे लिए काम नहीं करते थे। लेकिन यह ठीक काम करता है।
user3768495

114

बस मेरे जैसे सुपर नॉब्स के लिए सोच रहा था कि कैसे या लोगों को क्या मतलब है

PRAGMA table_info('table_name') 

आप नीचे दिए गए विवरण के अनुसार उपयोग की तैयारी करना चाहते हैं। ऐसा करने से एक तालिका का चयन होता है जो आपके टेबल से संबंधित मानों को छोड़कर इस तरह दिखता है।

cid         name        type        notnull     dflt_value  pk        
----------  ----------  ----------  ----------  ----------  ----------
0           id          integer     99                      1         
1           name                    0                       0

जहां आईडी और नाम आपके कॉलम के वास्तविक नाम हैं। तो उस मान को प्राप्त करने के लिए आपको कॉलम नाम का उपयोग करके चयन करना होगा:

//returns the name
sqlite3_column_text(stmt, 1);
//returns the type
sqlite3_column_text(stmt, 2);

जो वर्तमान पंक्ति के कॉलम का नाम लौटाएगा। उन सभी को हथियाने के लिए या जिसको आप चाहते हैं उसे सभी पंक्तियों के माध्यम से पुनरावृत्त करना चाहते हैं। ऐसा करने का सबसे सरल तरीका नीचे तरीके से होगा।

//where rc is an int variable if wondering :/
rc = sqlite3_prepare_v2(dbPointer, "pragma table_info ('your table name goes here')", -1, &stmt, NULL);

if (rc==SQLITE_OK)
{
    //will continue to go down the rows (columns in your table) till there are no more
    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        sprintf(colName, "%s", sqlite3_column_text(stmt, 1));
        //do something with colName because it contains the column's name
    }
}

46

यदि आप अपने प्रश्नों के आउटपुट को कॉलम नामों में शामिल करना चाहते हैं और कॉलम के रूप में सही ढंग से संरेखित करना चाहते हैं, तो इन कमांड का उपयोग करें sqlite3:

.headers on
.mode column

आपको आउटपुट मिलेगा:

sqlite> .headers on
sqlite> .mode column
sqlite> select * from mytable;
id          foo         bar
----------  ----------  ----------
1           val1        val2
2           val3        val4

18

स्तंभों की एक सूची प्राप्त करने के लिए आप बस इसका उपयोग कर सकते हैं:

.schema tablename

3
यह ALTER स्टेटमेंट के साथ जोड़े गए कॉलम नहीं दिखाएगा।
राजेशम

14

कॉलम नामों की एक सूची प्राप्त करने का एक वैकल्पिक तरीका यहां उल्लेखित नहीं है, यह एक व्यावहारिक कार्य से चयन करना है:

SELECT name FROM PRAGMA_TABLE_INFO('your_table');
name      
tbl_name  
rootpage  
sql

आप जाँच सकते हैं कि क्या एक निश्चित कॉलम चल रहा है:

SELECT 1 FROM PRAGMA_TABLE_INFO('your_table') WHERE name='sql';
1

यदि आप sqlite_master या pragma table_info से चुनिंदा sql के परिणाम को पार्स नहीं करना चाहते हैं तो आप इसका उपयोग करते हैं।

संदर्भ:

https://www.sqlite.org/pragma.html#pragfunc


अच्छा साफ दृष्टिकोण। और मुझे इससे पहले PRAGMA फ़ंक्शन का पता नहीं था। धन्यवाद।
फहीम मीठा

12

यदि आप किसी विशेष कॉलम को खोज रहे हैं तो आप लाइक स्टेटमेंट का उपयोग कर सकते हैं

उदाहरण के लिए:

SELECT * FROM sqlite_master where sql like('%LAST%')


7

मुझे पता है कि यह एक पुराना धागा है, लेकिन हाल ही में मुझे इसकी ज़रूरत थी और एक साफ तरीका मिल गया:

SELECT c.name FROM pragma_table_info('your_table_name') c;

1
आपका मतलब था:where t.name = 'table';
ल्यूक

क्या आपको मेरे जवाब से साफ रास्ता मिल गया? 😂
user1461607

6

स्तंभ जानकारी प्राप्त करने के लिए आप निम्नलिखित स्निपेट का उपयोग कर सकते हैं:

String sql = "select * from "+oTablename+" LIMIT 0";
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
ResultSetMetaData mrs = rs.getMetaData();
for(int i = 1; i <= mrs.getColumnCount(); i++)
{
    Object row[] = new Object[3];
    row[0] = mrs.getColumnLabel(i);
    row[1] = mrs.getColumnTypeName(i);
    row[2] = mrs.getPrecision(i);
}

यह विचार, जुड़ाव, आदि के साथ काम करता है - लेकिन डीबी आवरण क्या है?
एरिक एरोनिटी

यह बस jdbc है। कोई आवरण नहीं।
देवोलस

6
//JUST little bit modified the answer of giuseppe  which returns array of table columns
+(NSMutableArray*)tableInfo:(NSString *)table{

    sqlite3_stmt *sqlStatement;

    NSMutableArray *result = [NSMutableArray array];

    const char *sql = [[NSString stringWithFormat:@"PRAGMA table_info('%@')",table] UTF8String];

    if(sqlite3_prepare(md.database, sql, -1, &sqlStatement, NULL) != SQLITE_OK)

    {
        NSLog(@"Problem with prepare statement tableInfo %@",
                [NSString stringWithUTF8String:(const char *)sqlite3_errmsg(md.database)]);

    }

    while (sqlite3_step(sqlStatement)==SQLITE_ROW)
    {
        [result addObject:
          [NSString stringWithUTF8String:(char*)sqlite3_column_text(sqlStatement, 1)]];
    }

    return result;
}

4

जब आप टेबल के अंदर होते हैं तो साइक्लाइट कंसोल में .schema यह मेरे लिए कुछ इस तरह दिखता है ...

sqlite>.schema
CREATE TABLE players(
id integer primary key,
Name varchar(255),
Number INT,
Team varchar(255)

3
-(NSMutableDictionary*)tableInfo:(NSString *)table
{
  sqlite3_stmt *sqlStatement;
  NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
  const char *sql = [[NSString stringWithFormat:@"pragma table_info('%s')",[table UTF8String]] UTF8String];
  if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
  {
    NSLog(@"Problem with prepare statement tableInfo %@",[NSString stringWithUTF8String:(const char *)sqlite3_errmsg(db)]);

  }
  while (sqlite3_step(sqlStatement)==SQLITE_ROW)
  {
    [result setObject:@"" forKey:[NSString stringWithUTF8String:(char*)sqlite3_column_text(sqlStatement, 1)]];

  }

  return result;
  }

3
function getDetails(){
var data = [];
dBase.executeSql("PRAGMA table_info('table_name') ", [], function(rsp){
    if(rsp.rows.length > 0){
        for(var i=0; i<rsp.rows.length; i++){
            var o = {
                name: rsp.rows.item(i).name,
                type: rsp.rows.item(i).type
            } 
            data.push(o);
        }
    }
    alert(rsp.rows.item(0).name);

},function(error){
    alert(JSON.stringify(error));
});             
}

3

मुझे पता है कि बहुत देर हो चुकी है लेकिन इससे अन्य मदद मिलेगी।

तालिका का कॉलम नाम खोजने के लिए, आपको निष्पादित करना चाहिए select * from tbl_nameऔर आपको परिणाम प्राप्त होगा sqlite3_stmt *। और कुल प्राप्त कॉलम पर स्तंभ पुनरावृति की जाँच करें। कृपया उसी के लिए निम्नलिखित कोड देखें।

// sqlite3_stmt *statement ;
int totalColumn = sqlite3_column_count(statement);
for (int iterator = 0; iterator<totalColumn; iterator++) {
   NSLog(@"%s", sqlite3_column_name(statement, iterator));
}

यह परिणाम सेट के सभी कॉलम नामों को प्रिंट करेगा।


2

.schema table_name

यह डेटाबेस से तालिका के कॉलम नामों को सूचीबद्ध करेगा।

आशा है कि यह मदद करेगा !!!


0

हो सकता है कि आप सिर्फ कंसोल पर टेबल हेडर प्रिंट करना चाहते हैं। यह मेरा कोड है: (प्रत्येक तालिका के लिए)

    // ------------------ show header ----------------


    char sqlite_stmt_showHeader[1000];
    snprintf(sqlite_stmt_showHeader, 1000, "%s%s", "SELECT * FROM ", TABLE_NAME_STRING UTF8String]);

    sqlite3_stmt* statement_showHeader;
    sqlite3_prepare_v2(DATABASE, sqlite_stmt_showHeader, -1, &statement_showHeader, NULL);

    int headerColumnSize = sqlite3_column_count(statement_showHeader);

    NSString* headerRow = @"|";

    for (int j = 0; j < headerColumnSize; j++) {
        NSString* headerColumnContent = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_name(statement_showHeader, j)];
        headerRow = [[NSString alloc] initWithFormat:@"%@ %@ |", headerRow, headerColumnContent];
    }

    NSLog(@"%@", headerRow);


    sqlite3_finalize(statement_showHeader);

    // ---------------- show header end ---------------------
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.