2009-03-26 15 views
43

Es posible conseguir una fila con todos los nombres de las columnas de una tabla como esta:¿Cómo obtener una lista de nombres de columna

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

no me gusta usar Pragma table_info(bla).

+8

Por curiosidad, ¿por qué _No_ uso pragma? – Phil

+0

@Phil Porque no vale la pena no se puede obtener el nombre de la tabla devuelta .. :( – rptwsthi

+2

Un problema podría ser que no se puede unir el resultado de un pragma. Por ejemplo, si desea obtener todos los nombres de tablas y sus columnas en el mismo conjunto de resultados – anakic

Respuesta

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

continuación, analizar este valor con Reg Exp (es fácil) que podría ser similar a ésta: [(.*?)]

Alternativamente, puede utilizar:

PRAGMA table_info(table_name) 
+0

¡Una gran respuesta! – Kalanamith

+0

' A continuación, analizar este valor con Reg Exp (es fácil) ... 'es realmente vago, un ejemplo completo de una consulta con la expresión regular para obtener la columna defs hubiera sido muy útil aquí. – ChrisProsser

+0

Dejo esto para los próximos: este regex '" ([^ "] +)" (?! \() 'parece funcionar. –

0
$<? 
$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"; 
} 
+6

No solo publique código, también explique por qué y cómo funciona. – Chad

6

Esto ayuda para 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; 
}); 

Puede reutilizar la expresión regular en su idioma para obtener los nombres de las columnas.

alternativa más corta:

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

solo para observar, ambas soluciones asumen que no hay espacios adicionales u otros espacios en blanco en el campo 'sql' de la tabla SQLITE_MASTER. ya que este campo contiene texto de consulta literal utilizado para crear la tabla, esto no siempre es cierto. También estoy pensando que no manejará correctamente los nombres de campo que contienen espacios. – Michael

+0

Gran solución. Me preocupaba que esto no incluyera alteraciones posteriores en la columna, pero, según la especificación, la columna "sql" contiene "una copia del texto original de la declaración CREATE que creó el objeto, excepto el normalizado como se describió anteriormente y modificado por ALTER TABLE declaraciones. ". –

0

Usando @ respuesta de Tarkus, aquí están las expresiones regulares que utilicé en 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 
} 

Código es un poco descuidado, pero parece que funciona.

25

Si está utilizando el shell de línea de comandos para SQLite, entonces .headers on antes de realizar su consulta. Solo necesita hacer esto una vez en una sesión determinada.

+4

Utilice tanto '.mode column' como' .headers on' para aquellos que quieran obtener el típico formato de salida SELECT que están acostumbrados a ver con otras shells SQL. –

0

El conjunto de resultados de una consulta en PHP ofrece un par de funciones que permiten precisamente eso:

numCols() 
    columnName(int $column_number) 

Ejemplo

$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; 
    } 
0

Prueba este sqlite esquema de la tabla analizador, que implementa el analizador tabla SQLite para analizar las definiciones de tabla en PHP.

Devuelve las definiciones completas (clave única, primaria, el tipo, la precisión, no nulos, las referencias, las restricciones de tabla ... etc)

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

Cuestiones relacionadas