MySQL:从查询中获取列名或别名

我不要求SHOW COLUMNS命令。

我想创build一个类似于heidisql的应用程序,您可以在其中指定一个SQL查询,并在执行时返回一个结果集,其中包含表示查询结果的行和列。 结果集中的列名应与您在SQL查询中定义的所选列匹配。

在我的Python程序(使用MySQLdb )中,我的查询只返回行和列结果,而不是列名。 在以下示例中,列名将是exttotalsizefilecount 。 SQL最终将从程序的外部。

我能想出这个工作的唯一方法是编写我自己的SQLparsing器逻辑来提取选定的列名称。

有没有一种简单的方法来获取所提供的SQL的列名? 接下来,我需要知道查询返回多less列

 # 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() 

cursor.description会给你一个元组的元组,其中每个元素的[0]是列标题。

 num_fields = len(cursor.description) field_names = [i[0] for i in cursor.description] 

这与使用列表和字典理解的pythonic方式是一样的

 columns = cursor.description result = [{columns[index][0]:column for index, column in enumerate(value)} for value in cursor.fetchall()] pprint.pprint(result) 

类似于@詹姆斯的回答,一个更pythonic的方式可以是:

 fields = map(lambda x:x[0], cursor.description) result = [dict(zip(fields,row)) for row in cursor.fetchall()] 

你可以得到一个单独的列与地图上的结果:

 extensions = map(lambda x: x['ext'], result) 

或过滤结果:

 filter(lambda x: x['filesize'] > 1024 and x['filesize'] < 4096, result) 

或累积过滤列的值:

 totalTxtSize = reduce( lambda x,y: x+y, filter(lambda x: x['ext'].lower() == 'txt', result) ) 

我认为这应该做你需要(build立在上面的答案)。 我相信这是一个更加pythony的方式来写它,但你应该得到的总体思路。

 cursor.execute(query) columns = cursor.description result = [] for value in cursor.fetchall(): tmp = {} for (index,column) in enumerate(value): tmp[columns[index][0]] = column result.append(tmp) pprint.pprint(result) 

看起来MySQLdb实际上并不提供该API调用的翻译。 相关的C API调用是mysql_fetch_fields ,并没有MySQLdb的翻译

你也可以使用MySQLdb.cursors.DictCursor 。 这将您的结果集转换为python字典的Python列表,虽然它使用了一个特殊的光标,因此在技术上比可接受的答案更便于携带。 不知道速度。 这是使用这个编辑的原始代码。

 #!/usr/bin/python -u import MySQLdb import MySQLdb.cursors #=================================================================== # connect to mysql #=================================================================== try: db = MySQLdb.connect(host='myhost', user='myuser', passwd='mypass', db='mydb', cursorclass=MySQLdb.cursors.DictCursor) except MySQLdb.Error, e: print 'Error %d: %s' % (e.args[0], e.args[1]) sys.exit(1) #=================================================================== # query select from table #=================================================================== cursor = db.cursor() sql = 'SELECT ext, SUM(size) AS totalsize, COUNT(*) AS filecount FROM fileindex GROUP BY ext ORDER BY totalsize DESC;' cursor.execute(sql) all_rows = cursor.fetchall() print len(all_rows) # How many rows are returned. for row in all_rows: # While loops always make me shudder! print '%s %s %s\n' % (row['ext'], row['totalsize'], row['filecount']) cursor.close() db.close() 

使用标准字典函数,例如len(row[0])来计算第一行的列数, list(row[0])列名称(第一行)等等。希望这个帮助!