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)
为什么这样改有效
- 每次拉取最新数据:把
maps = db.child().get()移到函数内部后,每次点击按钮都会重新向Firebase发起请求,拿到最新的数据集。 - 避免数据重复:每次调用函数都初始化
result = [],确保返回的是当前最新的、没有冗余的数据。 - 性能优化:直接用
map.val()获取所有字段,减少了多次单独请求Firebase的开销,代码也更简洁。
内容的提问来源于stack exchange,提问作者Nakname
相关产品推荐
相关产品推荐

