2011-05-13 5 views
8

J'utilise le module sqlite3 de Python et j'aimerais obtenir une liste de toutes les colonnes d'une table quand la table n'a pas de ligne.Récupère la liste des noms de colonnes d'une table vide

Normalement, si je crée une base de données comme

import sqlite3 

conn = sqlite3.connect(":memory:") 
c = conn.cursor() 

# create the table schema 
c.execute('''create table stocks 
(date text, trans text, symbol text, 
    qty real, price real)''') 

conn.commit() 
c.close() 

Je peux obtenir les noms de colonnes avec quelque chose comme

conn.row_factory = sqlite3.Row 
c = conn.cursor() 
c.execute('select * from stocks') 
r = c.fetchone() 
print r.keys() 

Le problème est, si la table est initialement vide, c.fetchone() retours None . S'il y a des lignes validées, alors je peux obtenir une liste des noms de colonnes.

Existe-t-il une autre façon de le faire? Je suis allé à travers le sqlite3module documentation officiel, mais n'a pas pu trouver quelque chose d'utile à cet égard.

Je suppose que je pourrais mettre des données factices dans la table, puis récupérer les noms des colonnes et ensuite supprimer la ligne, mais j'espérais qu'il y avait une façon plus élégante de le faire.

Edit:

Semble il y a quelques façons de le faire:

  1. Obtenez le SQL qui a été utilisé pour créer la table:

    c.execute("""SELECT sql FROM sqlite_master 
    WHERE tbl_name = 'stocks' AND type = 'table'""") 
    
  2. Utilisez le PRAGMA déclaration de sqlite3:

    c.execute("PRAGMA table_info(stocks)") 
    
  3. Utilisez le champ .description de l'objet Cursor

    c.execute('select * from stocks') 
    r=c.fetchone() 
    print c.description 
    

Parmi ceux-ci, n ° 2 semble la plus simple et la plus simple. Merci à tous pour votre aide.

Répondre

5

essayer avec:

conn.row_factory = sqlite3.Row 
c = conn.cursor() 
c.execute('select * from stocks') 
r = c.fetchone() 
print c.description   # This will print the columns names 

>>> (('date', None, None, None, None, None, None), ('trans', None, None, None, None, None, None), ('symbol', None, None, None, None, None, None), ('qty', None, None, None, None, None, None), ('price', None, None, None, None, None, None)) 

Comme expliqué here, seuls les premiers éléments de chaque 7-tuple est utile.

+2

'sélectionner ... limite 1', non? – dan3

3
import sqlite3 
con=sqlite3.connect(":memory:") 
c=con.cursor() 
c.execute("select * from stocks") 
fieldnames=[f[0] for f in c.description] 
Questions connexes