Comment obtenir une liste des noms de colonne sur la base de données Sqlite3?


373

Je souhaite migrer mon application iPhone vers une nouvelle version de base de données. Comme je n'ai pas de version enregistrée, je dois vérifier si certains noms de colonne existent.

Cette entrée Stackoverflow suggère de faire la sélection

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

et analyser le résultat.

Est-ce la voie courante? Des alternatives?


Pour le cas spécifique de SQLite.swift, consultez cette question et réponse pour une liste simple des noms de colonne ou celle-ci pour les problèmes de migration.
Suragch

Réponses:


586
PRAGMA table_info(table_name);

vous obtiendra une liste de tous les noms de colonne.


19
mais vous ne pouvez pas sélectionner dans ce tableau. C'est tout simplement ennuyeux. J'essaye quelque chose comme ça ... mais ça ne marche pascreate 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

Juste pour mettre cela en termes de code pour SQLiteDatabase sur Android, écrivezdb.rawQuery("PRAGMA table_info(" + tablename + ")", null);
Noumenon

4
Cela fonctionnera également en cas de vue. PRAGMA table_info (View_Name); Ceci

pourquoi ne pas simplement coller "limite 0" à la fin d'une instruction select? int cols = sqlite3_column_count (stmt); fprintf (stdout, "% d colonnes \ 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 ne renvoie aucune colonne.
William Entriken

213

Si vous avez la base de données sqlite, utilisez le programme de ligne de commande sqlite3 et ces commandes:

Pour répertorier toutes les tables de la base de données:

.tables

Pour afficher le schéma pour une donnée tablename:

.schema tablename

8
Bien que la sortie ne soit pas aussi "lisible" (peut-être), c'est_much_ plus facile à retenir quePRAGMA table_info(table_name);
Nick Tomlin

8
@NickTomlin Malheureusement, cette méthode nécessite d'avoir le programme de ligne de commande sqlite3, car les commandes point ne sont pas du SQL valide.
Michael

188

Si tu fais

.headers ON

vous obtiendrez le résultat souhaité.


3
comment aligner les en-têtes avec le contenu ci-dessous?
Dimanche

6
Et pour toujours l'avoir, mettez-le dans votre .sqlitercdossier .
ruffin

Cela devrait-il fonctionner avec une table vide? Je ne vois toujours pas les noms des colonnes
Christopher Pisz

Pour certaines raisons que je ne connais pas, la PRAGMAméthode et la .schemaméthode n'ont pas fonctionné pour moi. Mais celui-ci fonctionne très bien.
user3768495

114

Juste pour les super noobs comme moi qui se demandent comment ou ce que les gens entendent par

PRAGMA table_info('table_name') 

Vous souhaitez l'utiliser comme votre instruction de préparation, comme indiqué ci-dessous. Cela sélectionne une table qui ressemble à ceci, sauf qu'elle est remplie de valeurs relatives à votre table.

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

Où id et nom sont les noms réels de vos colonnes. Donc, pour obtenir cette valeur, vous devez sélectionner le nom de la colonne en utilisant:

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

Qui renverra le nom de la colonne de la ligne actuelle. Pour les saisir tous ou trouver celui que vous voulez, vous devez parcourir toutes les lignes. La manière la plus simple de le faire serait de la manière suivante.

//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 vous souhaitez que la sortie de vos requêtes inclue les noms des colonnes et soit correctement alignée en tant que colonnes, utilisez ces commandes dans sqlite3:

.headers on
.mode column

Vous obtiendrez une sortie comme:

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

18

Pour obtenir une liste de colonnes, vous pouvez simplement utiliser:

.schema tablename

3
Cela n'affichera pas les colonnes ajoutées avec l'instruction ALTER.
RajeshM

14

Une autre façon d'obtenir une liste de noms de colonnes non mentionnés ici est de sélectionner une fonction pragma:

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

Vous pouvez vérifier si une certaine colonne existe en exécutant:

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

C'est ce que vous utilisez si vous ne voulez pas analyser le résultat de select sql from sqlite_master or pragma table_info.

Référence:

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


Belle approche propre. Et je ne connaissais pas les fonctions de PRAGMA avant cela. Je vous remercie.
Faheem Mitha

13

Lorsque vous exécutez le sqlite3cli, en tapant:

sqlite3 -header

donnera également le résultat souhaité


12

vous pouvez utiliser l'instruction Like si vous recherchez une colonne particulière

ex:

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

7

Je sais que c'est un vieux fil, mais récemment j'ai eu besoin de la même chose et j'ai trouvé un moyen soigné:

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

1
Vous vouliez dire:where t.name = 'table';
Luuk

avez-vous trouvé le bon moyen de ma réponse? 😂
user1461607

6

Pour obtenir les informations de la colonne, vous pouvez utiliser l'extrait de code suivant:

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

cela fonctionne avec les vues, les jointures, etc. - mais de quel wrapper db s'agit-il?
Erik Aronesty

C'est simplement jdbc. Aucun emballage.
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 dans la console sqlite quand vous avez vous êtes à l'intérieur du tableau ça ressemble à ça pour moi ...

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

Je sais qu'il est trop tard mais cela aidera les autres.

Pour trouver le nom de colonne de la table, vous devez exécuter select * from tbl_nameet vous obtiendrez le résultat sqlite3_stmt *. et vérifiez l'itération de la colonne sur le total de la colonne récupérée. Veuillez vous référer au code suivant pour la même chose.

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

Cela affichera tous les noms de colonnes de l'ensemble de résultats.


2

.schema table_name

Cela répertoriera les noms de colonnes de la table de la base de données.

J'espère que cela vous aidera !!!


0

Vous souhaitez peut-être simplement imprimer les en-têtes du tableau sur la console. Voici mon code: (pour chaque table)

    // ------------------ 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 ---------------------
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.