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

Telegram Bot从Firebase Realtime Database获取数据时重复显示旧数据而非更新的问题求助

问题分析与解决方案

我一眼就瞅出问题所在了——你把Firebase数据拉取和结果列表都定义成了全局变量,这就导致它们只会在程序启动时初始化一次,后续点击按钮根本不会去请求新数据!

具体问题点

  • maps = db.child().get() 是全局变量:程序启动时只会从Firebase获取一次数据,之后不管你点多少次按钮,用的都是第一次缓存的旧数据。
  • result = [] 是全局列表:每次调用collect_maps()都会往里面追加内容,时间久了还会出现旧数据重复叠加的情况。

修改后的代码

把这两个变量移到collect_maps()函数内部,让每次调用都重新拉取最新数据并初始化结果列表:

firebase = pyrebase.initialize_app(firebaseConfig)
db = firebase.database()

# 修正后的collect_maps函数
def collect_maps():
    # 每次调用都重新从Firebase获取最新数据
    maps = db.child().get()
    result = []  # 每次初始化空列表,避免重复追加
    for map in maps.each():
        # 优化:直接从map快照中获取所有字段,减少多次Firebase请求
        map_data = map.val()
        result.append(
            {
                'id': map_data.get('id'),
                'name': map_data.get('name'),
                'longitude': map_data.get('longitude'),
                'latitude': map_data.get('latitude')
            }
        )
    return result

# 消息处理代码保持不变
@dp.message_handler(Text(equals='Get Maps'))
async def get_maps(message: types.Message):
    await message.answer('Please wait a bit...')
    data = collect_maps()
    keyboard = types.InlineKeyboardMarkup()
    key = types.InlineKeyboardButton('Get Location', callback_data='Get Location')
    keyboard.add(key)
    user_id = message.from_user.id
    await message.answer('Your maps, that i collected:')
    for index, item in enumerate(data):
        card = f'{index+1}) {item.get("id")} - {item.get("name")}\n' \
               f'Longitude: {item.get("longitude")}\n' \
               f'Latitude: {item.get("latitude")}\n'
        await message.answer(card, reply_markup=keyboard)

为什么这样改有效

  1. 每次拉取最新数据:把maps = db.child().get()移到函数内部后,每次点击按钮都会重新向Firebase发起请求,拿到最新的数据集。
  2. 避免数据重复:每次调用函数都初始化result = [],确保返回的是当前最新的、没有冗余的数据。
  3. 性能优化:直接用map.val()获取所有字段,减少了多次单独请求Firebase的开销,代码也更简洁。

内容的提问来源于stack exchange,提问作者Nakname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:57:45