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

Python+Telethon出现database is locked错误的解决方法

解决Telethon的sqlite3.OperationalError: database is locked错误

错误原因

你代码里同时初始化了两个使用同一个session文件的TelegramClient实例:

  • 先创建了client = TelegramClient('test', api_id, api_hash)
  • 又在for循环里用with TelegramClient('test', api_id, api_hash) as client:重新创建实例

Telethon的sqlite session不允许多个客户端同时读写同一个session数据库,这就导致了数据库锁定的错误。

修复方案

只初始化一次TelegramClient,把所有聊天的消息获取逻辑放在同一个客户端连接里执行,避免重复创建实例占用session数据库。

修改后的代码如下:

from telethon.sync import TelegramClient
import datetime
import pandas as pd

api_id = 11874123
api_hash = '7d78879e63e0b956d5g77575e4665ba3'

chats = ['waqarzaka']

df = pd.DataFrame()

# 只初始化一次客户端,在with语句内处理所有聊天
with TelegramClient('test', api_id, api_hash) as client:
    for chat in chats:
        for message in client.iter_messages(chat, offset_date=datetime.date.today(), reverse=True):
            print(message)
            data = { 
                "group" : chat, 
                "sender" : message.sender_id, 
                "text" : message.text, 
                "date" : message.date
            }

            temp_df = pd.DataFrame(data, index=[1])
            df = pd.concat([df, temp_df], ignore_index=True)  # 推荐用concat替代append,append已被弃用

df['date'] = df['date'].dt.tz_localize(None)

df.to_excel("C:\\crypto\\data_{}.xlsx".format(datetime.date.today()), index=False)

额外优化点

  • 替换df.append(temp_df)为pd.concat([df, temp_df], ignore_index=True),因为append方法在Pandas 2.0+中已经被弃用,使用concat更稳定。
  • 移除了多余的client = TelegramClient('test', api_id, api_hash)语句,避免不必要的资源占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:38