111 votes

MySQL : Obtenir le nom ou l'alias d'une colonne à partir d'une requête

Je ne demande pas la SHOW COLUMNS commandement.

Je souhaite créer une application qui fonctionne de manière similaire à heidisql, où vous pouvez spécifier une requête SQL qui, une fois exécutée, renvoie un jeu de résultats avec des lignes et des colonnes représentant le résultat de votre requête. Les noms des colonnes dans le jeu de résultats doivent correspondre aux colonnes sélectionnées telles que définies dans votre requête SQL.

Dans mon programme Python (utilisant MySQLdb ), ma requête ne renvoie que les résultats des lignes et des colonnes, mais pas les noms des colonnes. Dans l'exemple suivant, les noms des colonnes seraient ext , totalsize y filecount . Le SQL sera finalement exclu du programme.

Le seul moyen que j'ai trouvé pour que cela fonctionne est d'écrire ma propre logique d'analyseur SQL pour extraire les noms des colonnes sélectionnées.

Existe-t-il un moyen simple d'obtenir les noms des colonnes pour le code SQL fourni ? Ensuite, j'ai besoin de savoir combien de colonnes la requête retourne ?

# Python

import MySQLdb

#===================================================================
# connect to mysql
#===================================================================

try:
    db = MySQLdb.connect(host="myhost", user="myuser", passwd="mypass",db="mydb")
except MySQLdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit (1)

#===================================================================
# query select from table
#===================================================================

cursor = db.cursor ()   

cursor.execute ("""\
     select ext,
        sum(size) as totalsize,
        count(*) as filecount
     from fileindex
    group by ext
    order by totalsize desc;
""")

while (1):
    row = cursor.fetchone ()
    if row == None:
        break
    print "%s %s %s\n" % (row[0], row[1], row[2])

cursor.close()
db.close()

9voto

Michael Liberman Points 487

Il ne s'agit que d'un complément à la réponse acceptée :

def get_results(db_cursor):
    desc = [d[0] for d in db_cursor.description]
    results = [dotdict(dict(zip(desc, res))) for res in db_cursor.fetchall()]
    return results

dotdict est :

class dotdict(dict):
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

Cela vous permettra d'accéder plus facilement aux valeurs par nom de colonne.
Supposons que vous ayez un user tableau avec colonnes name y email :

cursor.execute('select * from users')
results = get_results(cursor)
for res in results:
  print(res.name, res.email)

5voto

Quelque chose de similaire aux solutions proposées, sauf que le résultat est un json avec column_header : vaule pour db_query ie sql .

cur = conn.cursor()
cur.execute(sql)
res = [dict((cur.description[i][0], value) for i, value in enumerate(row)) for row in cur.fetchall()]

exemple de sortie json :

[
   {
      "FIRST_ROW":"Test 11",
      "SECOND_ROW":"Test 12",
      "THIRD_ROW":"Test 13"
   },
   {
      "FIRST_ROW":"Test 21",
      "SECOND_ROW":"Test 22",
      "THIRD_ROW":"Test 23"
   }
]

3voto

Amin Points 93

Essayez :

cursor.column_names

Version du connecteur mysql :

mysql.connector.__version__
'2.2.9'

2voto

Daniel DiPaolo Points 24085

Il semble que MySQLdb ne fournisse pas de traduction pour cet appel API. L'appel API C correspondant est mysql_fetch_fields y il n'y a pas de traduction MySQLdb pour cela

1voto

Adam Rhoades Points 11

Vous pouvez également procéder de la sorte pour obtenir uniquement les titres des champs :

table = cursor.description
check = 0
for fields in table:
    for name in fields:
        if check < 1:
            print(name),
        check +=1
    check =0

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