web-dev-qa-db-fra.com

Comment obtenir une liste de noms de colonnes

Il est possible d’obtenir une ligne avec tous les noms de colonne d’une table comme ceci:

|id|foo|bar|age|street|address|

Je n'aime pas utiliser Pragma table_info(bla).

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

Ensuite, analysez cette valeur avec Reg Exp (c'est facile), ce qui pourrait ressembler à ceci: [(.*?)]

Sinon, vous pouvez utiliser:

PRAGMA table_info(table_name)
81
Konstantin Tarkus

Si vous utilisez la ligne de commande Shell to SQLite, .headers on avant d’effectuer votre requête. Vous n'avez besoin de le faire qu'une fois dans une session donnée.

31

Cela aide pour HTML5 SQLite: 

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
  var columnNames = [];
  for(i in columnParts) {
    if(typeof columnParts[i] === 'string')
      columnNames.Push(columnParts[i].split(" ")[0]);
  }
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});

Vous pouvez réutiliser l'expression régulière dans votre langue pour obtenir les noms de colonne.

Alternative plus courte:

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnNames = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});
6
GeekTantra

Oui, vous pouvez y parvenir en utilisant les commandes suivantes:

sqlite> .headers on
sqlite> .mode column

Le résultat d'une sélection sur votre table ressemblera alors à:

id          foo         bar         age         street      address
----------  ----------  ----------  ----------  ----------  ----------
1           val1        val2        val3        val4        val5
2           val6        val7        val8        val9        val10
1
Owen Pauling

Le jeu de résultats d'une requête dans PHP offre quelques fonctions permettant justement cela:

    numCols() 
    columnName(int $column_number )

Exemple

    $db = new SQLIte3('mysqlite.db');
    $table = 'mytable';

    $tableCol = getColName($db, $table);

    for ($i=0; $i<count($tableCol); $i++){
        echo "Column $i = ".$tableCol[$i]."\n";
    }           

    function getColName($db, $table){
        $qry = "SELECT * FROM $table LIMIT 1";
        $result = $db->query($qry);
        $nCols = $result->numCols();
        for ($i = 0; $i < $ncols; $i++) {
            $colName[$i] = $result->columnName($i);
        }
        return $colName;
    }
1
Luis Rosety
$<?
$db = sqlite_open('mysqlitedb');
$cols = sqlite_fetch_column_types('form name'$db, SQLITE_ASSOC);
foreach ($cols as $column => $type) {
  echo "Column: $column  Type: $type\n";
}
0
Josh Parsons

En utilisant la réponse de @ Tarkus, voici les expressions rationnelles que j'ai utilisées dans R:

getColNames <- function(conn, tableName) {
    x <- dbGetQuery( conn, paste0("SELECT sql FROM sqlite_master WHERE tbl_name = '",tableName,"' AND type = 'table'") )[1,1]
    x <- str_split(x,"\\n")[[1]][-1]
    x <- sub("[()]","",x)
    res <- gsub( '"',"",str_extract( x[1], '".+"' ) )
    x <- x[-1]
    x <- x[-length(x)]
    res <- c( res, gsub( "\\t", "", str_extract( x, "\\t[0-9a-zA-Z_]+" ) ) )
    res
}

Le code est un peu bâclé, mais il semble fonctionner.

0
Ari B. Friedman

Utilisez une requête récursive. Donné

create table t (a int, b int, c int);

Courir:

with recursive
  a (cid, name) as (select cid, name from pragma_table_info('t')),
  b (cid, name) as (
    select cid, '|' || name || '|' from a where cid = 0
    union all
    select a.cid, b.name || a.name || '|' from a join b on a.cid = b.cid + 1
  )
select name
from b
order by cid desc
limit 1;

Sinon, utilisez simplement group_concat:

select '|' || group_concat(name, '|') || '|' from pragma_table_info('t')

Les deux donnent:

|a|b|c|
0
Lukas Eder

Essayez cet analyseur de schéma de table sqlite, j'ai mis en œuvre l'analyseur de table sqlite pour analyser les définitions de table en PHP.

Il renvoie les définitions complètes (unique, clé primaire, type, précision, non nul, références, contraintes de table, etc.)

https://github.com/maghead/sqlite-parser

0
c9s

Le moyen le plus simple d'obtenir les noms de colonne de la dernière commande SELECT exécutée consiste à utiliser la propriété description du curseur. Un exemple en Python:

print_me = "("
for description in cursor.description:
    print_me += description[0] + ", "
print(print_me[0:-2] + ')')
# Example output: (inp, output, reason, cond_cnt, loop_likely)
0
gherson