62 votes

Comment obtenir une liste de noms de colonnes

Est-il possible d'obtenir une ligne avec tous les noms de colonnes d'un tableau comme celui-ci ?

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

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

3voto

rsk82 Points 4160

Ma façon de le faire :

$tablecols = array_reduce(
  $db->query("PRAGMA table_info(`$tblname`)")->fetchAll(),
  function($rV,$cV) { $rV[]=$cV['name']; return $rV; },
  array()
);

2voto

Lukas Eder Points 48046

Utilisez une requête récursive. Étant donné

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

Cours :

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, il suffit d'utiliser group_concat :

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

Les deux donnent des résultats :

|a|b|c|

1voto

user1763377 Points 41

Le jeu de résultats d'une requête en PHP offre quelques fonctions permettant de faire 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;
    }

0voto

Ari B. Friedman Points 24940

En utilisant la réponse de @Tarkus, voici les regex que j'ai utilisés 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 quelque peu bâclé, mais il semble fonctionner.

0voto

c9s Points 384

Essayez ce parseur de schéma de table sqlite, j'ai implémenté le parseur 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X