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?

luebken
la source
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
Copie possible de Comment obtenir une liste des noms de colonne
Owen Pauling

Réponses:

586
PRAGMA table_info(table_name);

vous obtiendra une liste de tous les noms de colonne.

nevan king
la source
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
George Hilliard
la source
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é.

Roland Orre
la source
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
    }
}
Birdbuster
la source
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
Owen Pauling
la source
18

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

.schema tablename
Aditya Joardar
la source
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

user1461607
la source
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é

Sam Houston
la source
12

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

ex:

SELECT * FROM sqlite_master where sql like('%LAST%')
Raamalakshmanan
la source
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;
Slavian Petrov
la source
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);
}
Devolus
la source
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;
}
Dattatray Deokar
la source
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)
Kevin Hu
la source
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;
  }
giuseppe
la source
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));
});             
}
Om Shankar
la source
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.

Rohit Kale
la source
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 !!!

Sakthi Velan
la source
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 ---------------------
Neo Wang
la source