¿Cómo obtener una lista de nombres de columna en la base de datos Sqlite3?


373

Quiero migrar mi aplicación de iPhone a una nueva versión de base de datos. Como no tengo alguna versión guardada, necesito verificar si existen ciertos nombres de columna.

Esta entrada de Stackoverflow sugiere hacer la selección

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

y analizar el resultado.

¿Es esa la forma común? ¿Alternativas?


Para el caso específico de SQLite.swift, vea esta pregunta y respuesta para obtener una lista simple de nombres de columna o esta para problemas de migración.
Suragch

Respuestas:


586
PRAGMA table_info(table_name);

obtendrá una lista de todos los nombres de columna.


19
pero no puedes seleccionar de esa tabla. Es simplemente molesto. Estoy intentando algo como esto ... pero no 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

Solo para poner esto en términos de código para SQLiteDatabase en Android, escribadb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

44
Esto también funcionará en el caso de View. PRAGMA table_info (View_Name); Esto mostrará una lista de todas las columnas de una Vista

¿por qué no simplemente pegar "límite 0" al final de una instrucción select? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d columnas \ n", cols); for (int i = 0; i <cols; i ++) fprintf (stdout, "% d.% s \ n", i, sqlite3_column_name (stmt, i));
Erik Aronesty

@ErikAronesty limit 0 no devuelve ninguna columna.
William Entriken

213

Si tiene la base de datos sqlite, use el programa de línea de comandos sqlite3 y estos comandos:

Para enumerar todas las tablas en la base de datos:

.tables

Para mostrar el esquema de un determinado tablename:

.schema tablename

8
Aunque la salida no es tan "legible" (tal vez) esto es_mucho_ más fácil de recordar quePRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Desafortunadamente, este método requiere tener el programa de línea de comandos sqlite3, ya que los comandos de punto no son SQL válidos.
Michael

188

Si lo haces

.headers ON

Obtendrás el resultado deseado.


3
¿Cómo alinear los encabezados con el contenido a continuación?
Sunnyday

66
Y para tener eso siempre encendido, póngalo en su .sqlitercarchivo .
ruffin

¿Debería funcionar esto con una mesa vacía? Todavía no veo los nombres de las columnas
Christopher Pisz el

Por alguna razón no lo sé, el PRAGMAmétodo y el .schemamétodo no funcionaron para mí. Pero este funciona bien.
user3768495

114

Solo para súper novatos como yo preguntándome cómo o qué querían decir las personas con

PRAGMA table_info('table_name') 

Desea usarlo como su declaración de preparación como se muestra a continuación. Al hacerlo, se selecciona una tabla que se ve así, excepto que se llena con valores pertenecientes a su tabla.

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

Donde id y name son los nombres reales de sus columnas. Entonces, para obtener ese valor, debe seleccionar el nombre de la columna utilizando:

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

Lo que devolverá el nombre de la columna de la fila actual. Para tomarlos todos o encontrar el que desea, debe recorrer todas las filas. La forma más sencilla de hacerlo sería de la siguiente manera.

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

Si desea que el resultado de sus consultas incluya nombres de columnas y se alinee correctamente como columnas, use estos comandos en sqlite3:

.headers on
.mode column

Obtendrá resultados como:

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

18

Para obtener una lista de columnas, simplemente puede usar:

.schema tablename

3
Esto no mostrará columnas agregadas con la instrucción ALTER.
RajeshM

14

Una forma alternativa de obtener una lista de nombres de columnas que no se mencionan aquí es seleccionar de una función pragma:

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

Puede verificar si existe una determinada columna ejecutando:

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

Esto es lo que usa si no desea analizar el resultado de seleccionar sql de sqlite_master o pragma table_info.

Referencia:

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


Buen enfoque limpio. Y no sabía de las funciones de PRAGMA antes de esto. Gracias.
Faheem Mitha

13

Cuando ejecutas el sqlite3cli, escribe:

sqlite3 -header

también dará el resultado deseado


12

puede usar la declaración Me gusta si está buscando una columna en particular

ex:

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

7

Sé que es un hilo viejo, pero recientemente necesitaba lo mismo y encontré una forma ordenada:

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

1
Querías decir:where t.name = 'table';
Luuk

¿Encontraste el camino ordenado de mi respuesta? 😂
user1461607

6

Para obtener la información de la columna, puede usar el siguiente fragmento:

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

esto funciona con vistas, combinaciones, etc., pero ¿qué db wrapper es este?
Erik Aronesty

Es simplemente jdbc. Sin envoltorio.
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 en la consola sqlite cuando tienes dentro de la mesa se ve algo así para mí ...

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

Sé que es demasiado tarde, pero esto ayudará a otros.

Para encontrar el nombre de columna de la tabla, debe ejecutar select * from tbl_namey obtendrá el resultado sqlite3_stmt *. y verifique la columna iterar sobre la columna total recuperada. Consulte el siguiente código para lo mismo.

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

Esto imprimirá todos los nombres de columna del conjunto de resultados.


2

.schema table_name

Esto enumerará los nombres de columna de la tabla de la base de datos.

Espero que esto ayude !!!


0

Tal vez solo desee imprimir los encabezados de la tabla en la consola. Este es mi código: (para cada tabla)

    // ------------------ 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 ---------------------
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.