36 votes

Trouver les noms de colonnes SQLite dans une table vide

Pour commencer, je suis en train d'écrire un outil de "documentation de schéma" qui génère une description des tables et des relations dans une base de données. Je suis en train de le modifier pour qu'il fonctionne avec SQLite.

J'ai réussi à extraire les noms de toutes les tables d'une base de données SQLite via une requête sur le fichier sqlite_master table. Pour chaque nom de table, je lance alors un simple

select * from <table name>

puis utilisez la fonction sqlite3_column_count() et sqlite3_column_name() pour collecter les noms de colonnes, que j'envoie ensuite à l'application sqlite3_table_column_metadata() pour obtenir des informations supplémentaires. C'est assez simple, non ?

Le problème est que cela ne fonctionne que pour les tables qui ne sont pas vides. C'est-à-dire que les sqlite_column_*() Les API ne sont valables que si sqlite_step() est revenu SQLITE_ROW ce qui n'est pas le cas pour les tables vides.

La question est donc la suivante : comment puis-je découvrir les noms de colonnes pour les tables vides ? Ou, plus généralement, y a-t-il un meilleur moyen d'obtenir ce type d'informations sur le schéma en SQLite ?

J'ai l'impression qu'il doit y avoir un autre caché sqlite_xxx table se cachant quelque part contenant cette information, mais jusqu'à présent je n'ai pas pu la trouver.

62voto

sqlite> .header on
sqlite> .mode column
sqlite> create table ABC(A TEXT, B VARCHAR);
sqlite> pragma table_info(ABC);
cid         name        type        notnull     dflt_value  pk
----------  ----------  ----------  ----------  ----------  ----------
0           A           TEXT        0                       0
1           B           VARCHAR     0                       0

10voto

Nick Dandoulakis Points 26809

Exécutez la requête :

PRAGMA table_info( your_table_name );

Documentation

5voto

GeekTantra Points 2606

PRAGMA table_info( your_table_name ); ne fonctionne pas dans HTML5 SQLite.

Voici un petit snippet HTML5 SQLite JavaScript qui récupère les noms des colonnes de votre_table_name même si elle est vide. J'espère que cela vous sera utile.

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(',');
  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;
});

4voto

user941581 Points 21

Exécutez cette requête

select * from (select "") left join my_table_to_test b on -1 = b.rowid;

Vous pouvez l'essayer sur moteur sqlite en ligne

3voto

Alex Martelli Points 330805

Le site PRAGMA L'énoncé suggéré par @pragmanatu fonctionne bien à travers n'importe quelle interface programmatique, aussi. Alternativement, le sql colonne de sqlite_master a le SQL déclaration CREATE TABLE &c &c qui décrit la table (mais, vous devez analyser cela, donc je pense que PRAGMA table_info est plus... pragmatique;-).

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