You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python/PyMySQL中按列标题展示SQL查询结果?

解决PyMySQL查询结果分列显示的问题

我来帮你一步步调整代码,让查询结果能整齐地按列展示,每个字段对应好标题~ 先说说原代码里几个影响输出的小问题:

  • 你先执行了results = cur.fetchall()把所有数据取走了,之后再循环for row in cur就拿不到任何数据了
  • 打印字段时用的g.genre_id和查询里的别名genreName不匹配,会导致报错或者取不到正确值
  • 直接单独print每个字段没有对齐处理,自然格式混乱
  • 查询操作不需要con.commit(),这个是针对增删改操作的

下面是调整后的代码,我做了这些优化:

  1. 用游标直接循环获取数据(或者用fetchall后循环结果集,两种方式都可以)
  2. 使用字符串格式化来固定每列宽度,保证对齐
  3. 修正字段引用,和SQL里的别名对应
  4. 先打印表头,再逐行打印数据,实现分列效果
def selectTopNactors(n):
    # Create a new connection
    con = connection()
    # Create a cursor that returns dictionaries (方便用字段别名取值)
    cur = con.cursor(pymysql.cursors.DictCursor)
    
    # Execute query
    sql = """
        SELECT g.genre_name AS 'genreName', 
               a.actor_id AS 'actorId', 
               COUNT(*) AS 'number_of_movies' 
        FROM actor AS a, role AS r, movie AS m, genre AS g, movie_has_genre AS mg 
        WHERE a.actor_id = r.actor_id 
          AND m.movie_id = r.movie_id 
          AND m.movie_id = mg.movie_id 
          AND g.genre_id = mg.genre_id 
          AND (g.genre_id , m.movie_id) IN (
              SELECT g.genre_id, m.movie_id 
              FROM movie AS m, genre AS g, movie_has_genre AS mg 
              WHERE m.movie_id = mg.movie_id 
                AND mg.genre_id = g.genre_id 
              ORDER BY g.genre_id
          ) 
        GROUP BY a.actor_id,g.genre_name 
        ORDER BY g.genre_name,number_of_movies DESC 
        LIMIT %s  # 这里用参数化查询,更安全
    """
    # 用n作为参数传入,避免SQL注入风险
    cur.execute(sql, (n,))
    
    # 先打印表头,用格式化字符串固定列宽
    print(f"{'Genre Name':<20} {'Actor ID':<10} {'Number of Movies':<20}")
    print("-" * 50)  # 打印分隔线
    
    # 循环获取每一行数据
    for row in cur:
        # 用字段别名取值,格式化输出对齐
        print(f"{row['genreName']:<20} {row['actorId']:<10} {row['number_of_movies']:<20}")
    
    # 查询操作不需要commit
    # con.commit()
    
    # 整理结果返回,表头加数据
    results = cur.fetchall()
    con.close()  # 别忘了关闭连接,避免资源泄漏
    return [("genreName", "actorId", "numberOfMovies"), results]

关键改动说明:

  • 使用pymysql.cursors.DictCursor创建游标,这样返回的每一行是字典,可以直接用SQL里的别名(比如genreName)取值,更直观
  • SQL里用%s作为占位符,把参数n传入,避免硬编码,也更安全(防止SQL注入)
  • 用f-string格式化输出,<20表示左对齐且占20个字符宽度,这样每列就能整齐对齐
  • 先打印表头和分隔线,让输出结构更清晰
  • 最后关闭数据库连接,避免资源浪费

这样运行后,你的输出就会是整齐的分列格式,比如:

Genre Name           Actor ID   Number of Movies      
--------------------------------------------------
Action               123        8                    
Comedy               456        12                   

内容的提问来源于stack exchange,提问作者Salih K. Chousein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:03