Como obter uma lista de nomes de colunas no banco de dados Sqlite3?


373

Quero migrar meu aplicativo do iPhone para uma nova versão do banco de dados. Como não tenho uma versão salva, preciso verificar se existem nomes de colunas.

Esta entrada Stackoverflow sugere fazer a seleção

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

e analise o resultado.

Essa é a maneira comum? Alternativas?


Para o caso específico de SQLite.swift, consulte esta pergunta e resposta para uma simples lista de nomes de coluna ou um presente para a migração questões.
Suragch

Respostas:


586
PRAGMA table_info(table_name);

você receberá uma lista de todos os nomes de colunas.


19
mas você não pode selecionar dessa tabela. É simplesmente irritante. Eu estou tentando algo assim ... mas isso não funcionacreate 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

Apenas para colocar isso em termos de código para SQLiteDatabase no Android, escrevadb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
Isso também funcionará no caso do View. PRAGMA table_info (Nome_Vista); Isso listará todas as colunas de uma View

por que não colocar "limite 0" no final de uma instrução select? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d colunas \ n", colunas); para (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

O limite 0 do ErikAronesty 0 não retorna nenhuma coluna.
William Entriken

213

Se você possui o banco de dados sqlite, use o programa de linha de comando sqlite3 e estes comandos:

Para listar todas as tabelas no banco de dados:

.tables

Para mostrar o esquema de um dado tablename:

.schema tablename

8
Embora a saída não é tão "legível" (talvez) este is_much_ mais fácil de lembrar do quePRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Infelizmente, esse método requer o programa de linha de comando sqlite3, pois os comandos dot não são SQL válidos.
Michael

188

Se você fizer

.headers ON

você obterá o resultado desejado.


3
como alinhar cabeçalhos com o conteúdo abaixo?
Sunnyday

6
E para sempre ter isso, coloque-o em seu .sqlitercarquivo .
Ruffin

Isso deve funcionar com uma tabela vazia? Ainda não estou vendo os nomes das colunas
Christopher Pisz 27/11

Por algumas razões que não sei, o PRAGMAmétodo e o .schemamétodo não funcionaram para mim. Mas este funciona muito bem.
user3768495

114

Apenas para super noobs como eu, me perguntando como ou o que as pessoas queriam dizer com

PRAGMA table_info('table_name') 

Você deseja usar isso como sua declaração de preparação, como mostrado abaixo. Fazer isso seleciona uma tabela com esta aparência, exceto que é preenchida com valores pertencentes à sua tabela.

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

Onde id e nome são os nomes reais de suas colunas. Portanto, para obter esse valor, você precisa selecionar o nome da coluna usando:

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

O que retornará o nome da coluna da linha atual. Para pegar todos eles ou encontrar o que você deseja, você precisa percorrer todas as linhas. A maneira mais simples de fazer isso seria da maneira abaixo.

//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 você deseja que a saída de suas consultas inclua nomes de colunas e seja alinhada corretamente como colunas, use estes comandos em sqlite3:

.headers on
.mode column

Você obterá saída como:

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

18

Para obter uma lista de colunas, você pode simplesmente usar:

.schema tablename

3
Isso não mostrará colunas adicionadas com a instrução ALTER.
RajeshM

14

Uma maneira alternativa de obter uma lista de nomes de colunas não mencionados aqui é selecionar a partir de uma função pragma:

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

Você pode verificar se existe uma determinada coluna executando:

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

É isso que você usa se não deseja analisar o resultado de sql selecionado em sqlite_master ou pragma table_info.

Referência:

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


Boa abordagem limpa. E eu não conhecia as funções do PRAGMA antes disso. Obrigado.
Faheem Mitha

13

Quando você executa o sqlite3cli, digitando:

sqlite3 -header

também dará o resultado desejado


12

você pode usar a instrução Like se estiver procurando por uma coluna específica

ex:

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

7

Eu sei que é um tópico antigo, mas recentemente eu precisava do mesmo e encontrei uma maneira elegante:

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

11
Você quis dizer:where t.name = 'table';
Luuk

você encontrou o caminho certo da minha resposta? 😂
user1461607

6

Para obter as informações da coluna, você pode usar o seguinte snippet:

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

isso funciona com visualizações, junções etc. - mas que wrapper db é esse?
Erik Aronesty

É simplesmente jdbc. Sem invólucro.
Devolus 21/05

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 no console sqlite quando você está dentro da tabela, parece algo assim para mim ...

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

Eu sei que é tarde demais, mas isso ajudará outros.

Para encontrar o nome da coluna da tabela, você deve executar select * from tbl_namee obterá o resultado sqlite3_stmt *. e verifique a coluna iterar sobre o total da coluna buscada. Consulte o seguinte código para o mesmo.

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

Isso imprimirá todos os nomes de coluna do conjunto de resultados.


2

.schema table_name

Isso listará os nomes das colunas da tabela no banco de dados.

Espero que isso ajude !!!


0

Talvez você queira apenas imprimir os cabeçalhos da tabela no console. Este é o meu código: (para cada tabela)

    // ------------------ 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 ---------------------
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.