Metadados para colunas em SQLite v2.8 (PHP5)
Pergunta
Como posso obter metadados / restrições (chave primária e "nulo permitido" em particular) para cada coluna em uma tabela SQLite v2.8 usando PHP5 (como mysql_fetch_field para MySql)?
sqlite_fetch_column_types
(OO: $db->fetchColumnTypes
) só recebe nome da coluna e tipo de dados:
http://dk.php.net/manual/ en / function.sqlite-busca-column-types.php
sqlite_master tem a info - mas não como uma variável. Exemplo:
SELECT name FROM SQLITE_MASTER;
... sqlite_master somente mostra uma matriz com essa estrutura (v2.8):
[type] => table
[name] => foo
[tbl_name] => foo
[rootpage] => 3
[sql] => CREATE TABLE foo ( id INTEGER PRIMARY KEY, name CHAR(255) )
(E o que é "rootpage"?)
Solução
Eu tive que fazer isso para implementar um método describeTable()
para SQLite quando eu trabalhava no Zend Framework. SQLite não tem qualquer maneira de obter informações muito detalhadas sobre metadados.
O que fiz foi para executar a seguinte consulta SQLite:
PRAGMA tableinfo( <tablename> );
Consulte http://www.sqlite.org/pragma.html , sob a título "Pragmas para consultar o esquema de banco de dados."
O conjunto de resultados retornado desta consulta tem colunas para:
- posição da coluna (número inteiro)
- nome da coluna (string)
- tipo de dados (string)
- nulo (0) x não-nula (1)
- valor padrão (string)
- chave primária (1)
Você pode ver o código PHP baixando Zend Framework e olhando em Zend_Db_Adapter_Pdo_Sqlite
classe, método describeTable()
. Você também pode visualizar a fonte on-line via browser repositório do código na framework.zend.com (embora muitas vezes não está funcionando).
FWIW, este não é como mysql_fetch_field()
. Esse método retorna metadados sobre um conjunto de resultados, que pode não ser a mesma coisa que metadados sobre uma tabela.
Outras dicas
Exemplo trecho de código que funcionou para mim ... para ilustrar solução de Bill Karwin (não é uma tentativa de responder a minha pergunta!)
$db = new SQLiteDatabase("db.sqlite2");
$rs = $db->arrayQuery("PRAGMA table_info( 'my_table' );");
print_r($rs);