2009-11-08 13 views
2

Comment puis-je obtenir des métadonnées/contraintes (clé primaire et "null autorisé" en particulier) pour chaque colonne dans une table SQLite v2.8 en utilisant PHP5 (comme mysql_fetch_field pour MySql) ?Métadonnées pour les colonnes dans SQLite v2.8 (PHP5)

sqlite_fetch_column_types (OO: $db->fetchColumnTypes) obtient seulement le nom de la colonne et le type de données:
http://dk.php.net/manual/en/function.sqlite-fetch-column-types.php

sqlite_master a l'info - mais pas comme une variable. Exemple:
SELECT name FROM SQLITE_MASTER;

... sqlite_master ne sort que d'un tableau avec cette structure (v2.8):

[type] => table 
[name] => foo 
[tbl_name] => foo 
[rootpage] => 3 
[sql] => CREATE TABLE foo (id INTEGER PRIMARY KEY, name CHAR(255)) 

(Et ce qui est "rootpage"?)

Répondre

1

je devais faire ceci pour implémenter une méthode describeTable() pour SQLite quand j'ai travaillé sur Zend Framework. SQLite n'a aucun moyen d'obtenir des informations très détaillées sur les métadonnées.

Ce que je ne faisais que pour exécuter la requête SQLite suivante:

PRAGMA tableinfo(<tablename>); 

Voir http://www.sqlite.org/pragma.html, sous la rubrique « pragma pour interroger le schéma de base de données. »

Le jeu de résultat retourné à partir de cette requête comporte des colonnes pour:

  • position de colonne (entier)
  • nom de colonne (chaîne)
  • type de données (chaîne)
  • de nullable (0) vs . non nulle (1)
  • valeur par défaut (string)
  • clé primaire (1)

Vous pouvez afficher le code PHP en téléchargeant Zend Framework et en recherchant dans la classe Zend_Db_Adapter_Pdo_Sqlite, méthode describeTable(). Vous pouvez également consulter la source en ligne via le navigateur du référentiel de code à l'adresse framework.zend.com (bien que cela ne fonctionne souvent pas).

FWIW, ce n'est pas comme mysql_fetch_field(). Cette méthode renvoie des métadonnées sur un ensemble de résultats, ce qui peut ne pas être la même chose que les métadonnées d'une table.

+0

Merci - excellente solution. –

1

Exemple d'extrait de code qui a fonctionné pour moi ... pour illustrer la solution de Bill Karwin (ce n'est pas une tentative de répondre à ma propre question!)

$db = new SQLiteDatabase("db.sqlite2"); 
$rs = $db->arrayQuery("PRAGMA table_info('my_table');"); 
print_r($rs);