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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:08:10