Come ottenere un elenco di nomi di colonne sul database Sqlite3?


373

Voglio migrare la mia app per iPhone su una nuova versione del database. Dal momento che non ho una versione salvata, devo verificare se esistono nomi di colonne specifici.

Questa voce Stackoverflow suggerisce di selezionare

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

e analizzare il risultato.

È quello il modo comune? Alternative?


Per il caso specifico di SQLite.swift, vedere questa domanda e la risposta per un semplice elenco di nomi di colonna o questo per problemi di migrazione.
Suragch,

Risposte:


586
PRAGMA table_info(table_name);

ti darà un elenco di tutti i nomi delle colonne.


19
ma non puoi selezionare da quella tabella. È semplicemente fastidioso. Sto provando qualcosa del genere ... ma non funzionacreate 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
Jason

Solo per metterlo in termini di codice per SQLiteDatabase su Android, scrividb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon l'

4
Questo funzionerà anche in caso di View. PRAGMA table_info (View_Name); Verranno elencate tutte le colonne di una vista

perché non limitarsi a "limitare 0" alla fine di un'istruzione select? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d colonne \ n", cols); per (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty,

@ErikAronesty limit 0 non restituisce alcuna colonna.
William Entriken,

213

Se si dispone del database sqlite, utilizzare il programma della riga di comando sqlite3 e questi comandi:

Per elencare tutte le tabelle nel database:

.tables

Per mostrare lo schema per un dato tablename:

.schema tablename

8
Anche se l'output non è "leggibile" (forse) questo è_molto_ più facile da ricordare diPRAGMA table_info(table_name);
Nick Tomlin,

8
@NickTomlin Sfortunatamente, questo metodo richiede di avere il programma della riga di comando sqlite3, poiché i comandi dot non sono SQL validi.
Michael,

188

Se fate

.headers ON

otterrai il risultato desiderato.


3
come allineare le intestazioni con i contenuti di seguito?
Sunnyday,

6
E per averlo sempre acceso, inseriscilo nel tuo .sqlitercfile .
ruffin

Dovrebbe funzionare con una tabella vuota? Non vedo ancora i nomi delle colonne
Christopher Pisz,

Per alcuni motivi che non conosco, il PRAGMAmetodo e il .schemametodo non hanno funzionato per me. Ma questo funziona benissimo.
user3768495,

114

Solo per i superbebe come me che mi chiedevo come o cosa intendessero le persone

PRAGMA table_info('table_name') 

Vuoi usarlo come dichiarazione di preparazione come mostrato di seguito. In questo modo si seleziona una tabella simile a questa tranne che viene popolata con valori relativi alla tabella.

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

Dove id e nome sono i nomi effettivi delle colonne. Quindi per ottenere quel valore devi selezionare il nome della colonna usando:

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

Che restituirà il nome della colonna della riga corrente. Per afferrarli tutti o trovare quello che desideri, devi scorrere tutte le righe. Il modo più semplice per farlo sarebbe nel modo seguente.

//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

Se desideri che l'output delle tue query includa i nomi delle colonne e sia correttamente allineato come colonne, usa questi comandi in sqlite3:

.headers on
.mode column

Otterrai un output come:

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

18

Per ottenere un elenco di colonne puoi semplicemente usare:

.schema tablename

3
Questo non mostrerà le colonne aggiunte con l'istruzione ALTER.
RajeshM,

14

Un modo alternativo per ottenere un elenco di nomi di colonne non menzionati qui è selezionare da una funzione pragma:

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

Puoi verificare se esiste una determinata colonna eseguendo:

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

Questo è ciò che usi se non vuoi analizzare il risultato di selezionare sql da sqlite_master o pragma table_info.

Riferimento:

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


Bel approccio pulito. E prima non conoscevo le funzioni di PRAGMA. Grazie.
Faheem Mitha,

13

Quando esegui il sqlite3cli, digitando:

sqlite3 -header

darà anche il risultato desiderato


12

puoi usare l'istruzione Like se stai cercando una colonna particolare

ex:

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

7

So che è un vecchio thread, ma recentemente ho avuto bisogno dello stesso e ho trovato un modo pulito:

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

1
Volevi dire:where t.name = 'table';
Luuk il

hai trovato la via pulita dalla mia risposta? 😂
user1461607

6

Per ottenere le informazioni sulla colonna puoi utilizzare il seguente frammento:

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);
}

funziona con viste, join, ecc. - ma che wrapper db è questo?
Erik Aronesty,

È semplicemente jdbc. Nessun involucro.
Devolus,

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 nella console sqlite quando hai dentro il tavolo sembra qualcosa del genere per me ...

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

So che è troppo tardi, ma questo aiuterà gli altri.

Per trovare il nome della colonna della tabella, è necessario eseguire select * from tbl_namee si otterrà il risultato sqlite3_stmt *. e controlla la colonna iterare sulla colonna recuperata totale. Si prega di fare riferimento al seguente codice per lo stesso.

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

Ciò stamperà tutti i nomi di colonna del set di risultati.


2

.schema table_name

Verranno elencati i nomi delle colonne della tabella dal database.

Spero che questo possa aiutare !!!


0

Forse vuoi solo stampare le intestazioni del tavolo sulla console. Questo è il mio codice: (per ogni tabella)

    // ------------------ 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 ---------------------
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.