Python中如何将MariaDB查询结果转为可快速搜索的字典?
解决MariaDB游标结果中高效查找条目问题
我来帮你搞定这个问题!你当前的核心问题是:cursor.fetchall()返回的rows是字典的列表,而不是以ID为键的映射字典,所以直接用key in rows这种方式根本没法匹配到你要找的条目——这个判断是在检查整个字典是否存在于列表中,而不是检查某个字典里的id值是否存在。
优化方案:先把数据库结果转成ID映射字典
我们可以先把从数据库拿到的rows转换成一个以播放列表ID为键、整行数据为值的字典,这样后续查找的时间复杂度会从O(n)降到O(1),而且代码会简洁很多:
cursor = mariadb_connection.cursor(dictionary=True) # 从外部服务获取播放列表 playlists = sp.user_playlists(username) # 从数据库检索播放列表 cursor.execute("SELECT id, name, monitor FROM playlists") rows = cursor.fetchall() # 把rows转换成以id为键的字典,方便快速查找 db_playlists = {row['id']: row for row in rows} while playlists: for i, playlist in enumerate(playlists['items']): playlist_id = playlist['id'] print("%4d %s %s" % (i + 1 + playlists['offset'], playlist_id, playlist['name'])) # 直接用ID在映射字典里查找,无需手动遍历整个rows列表 if playlist_id in db_playlists: # 如果找到,可以直接获取对应的数据库行数据 matched_row = db_playlists[playlist_id] print(f"找到匹配条目:ID: {matched_row['id']}, Name: {matched_row['name']}, Monitor: {matched_row['monitor']}") else: print("未找到对应条目") if playlists['next']: playlists = sp.next(playlists) else: playlists = None
为什么原来的方法无效?
你之前写的if key in rows:,这里的key是硬编码的"1",而且即使换成正确的播放列表ID,in操作符在列表上的行为是检查整个元素是否存在于列表中——也就是它会判断"某个ID"这个字符串是不是rows列表里的一个字典,而不是判断有没有字典的id键等于这个值,所以永远会返回False。
额外提示
如果你的数据库里播放列表ID是整数类型,记得要把外部服务拿到的playlist['id']转换成对应的整数类型再做匹配,避免因为类型不匹配导致查找失败。
内容的提问来源于stack exchange,提问作者InvalidSyntax
相关产品推荐
相关产品推荐

