Python 3.6:将Hive库表映射的for循环转为字典推导式遇问题求助
用字典推导式重构PyHive的数据库-表映射代码
Hey there! Let's break down the issues in your current code and fix it up with a proper dictionary comprehension.
原代码的核心问题
- 错误的字典键: 你写了
map_tbl_db['i'],这里的'i'是字符串字面量,不是循环变量i。这意味着每次循环都会把值存在同一个键'i'下,最后你的字典只会剩下最后一个数据库的表列表,完全达不到多键值对的效果。 - 虽然不是语法错误,但循环写法可以更简洁,用字典推导式能一行搞定逻辑。
正确的字典推导式实现
map_tbl_db = { db: extract_dbs_tbls(cur, 'show tables') for db in extract_dbs_tbls(cur, s='show databases') if cur.execute(f"use {db}") is None # 确保切换数据库操作完成后再查表格 }
代码说明
- 直接把循环变量
db作为字典的键,对应的值是切换到该数据库后查询到的表列表,完美匹配你要的{数据库名: 表列表}结构。 - 用Python3.6+支持的f-string格式化
use语句,比%s更清晰易读,也更安全。 - 加上
if cur.execute(...) is None是为了保证执行顺序:先切换到目标数据库,再执行show tables查询,避免逻辑顺序出错。
额外注意事项
- 确认你的
extract_dbs_tbls函数能正确处理游标结果,比如把cur.fetchall()返回的元组列表转换成纯字符串列表(例如[row[0] for row in cur.fetchall()]),否则字典的键或值可能会是元组类型,不符合预期。 - 因为游标是同一个对象,推导式是同步顺序执行的,连续执行SQL不会有并发问题,可以放心使用。
内容的提问来源于stack exchange,提问作者steves
相关产品推荐
相关产品推荐

