Telethon:操作错误:数据库已锁定

J.D*_*Doe 7 python-3.x telegram telethon

如果这是一个愚蠢的问题,我深表歉意。

我第一次尝试 telethon,它无法与我的 telegram API 同步。

当我输入以下代码时,我得到一个 IP 地址: 在此输入图像描述

但是当我尝试连接以启动或连接客户端时收到此消息:

在此输入图像描述

最后,OperationalError: database is locked当我尝试使用手机登录时出现错误。

在此输入图像描述

错误消息完整:

-------------------------------------------------------------------- 

OperationalError Traceback (most recent 
 call last)
<ipython-input-13-880bc0e4ea12> in <module>()
  1 from telethon import TelegramClient, sync
 ----> 2 client = TelegramClient('session_name', api_id, api_hash)
  3 
  4 client.connect()
  5 if not client.is_user_authorized():

 /anaconda3/lib/python3.7/site- 
 packages/telethon/client/telegrambaseclient.py in __init__(self, 
 session, api_id, api_hash, connection, use_ipv6, proxy, timeout, 
 request_retries, connection_retries, retry_delay, auto_reconnect, 
 sequential_updates, flood_sleep_threshold, device_model, 
 system_version, app_version, lang_code, system_lang_code, loop, 
 base_logger)
 221                 DEFAULT_DC_ID,
 222                 DEFAULT_IPV6_IP if self._use_ipv6 else 
 DEFAULT_IPV4_IP,
 --> 223                 DEFAULT_PORT
 224             )
 225 

 /anaconda3/lib/python3.7/site-packages/telethon/sessions/sqlite.py 
 in set_dc(self, dc_id, server_address, port)
184     def set_dc(self, dc_id, server_address, port):
185         super().set_dc(dc_id, server_address, port)
--> 186         self._update_session_table()
187 
188         # Fetch the auth_key corresponding to this data center

/anaconda3/lib/python3.7/site-packages/telethon/sessions/sqlite.py 
in _update_session_table(self)
205         # some more work before being able to save auth_key's 
 for

206         # multiple DCs. Probably done differently.
 --> 207         c.execute('delete from sessions')
208         c.execute('insert or replace into sessions values 
(?,?,?,?)', (
209             self._dc_id,

OperationalError: database is locked
Run Code Online (Sandbox Code Playgroud)

What does coroutine object AuthMethods._start at mean? Why is it giving database is locked?

Ma'*_*ruf 5

参考Telethon文档,如果未正确关闭数据库,数据库将被锁定。

在您的情况下,您同时使用session来自多个 TelegramClient 的相同文件。

第一的

In [9] client.start()
Run Code Online (Sandbox Code Playgroud)

Telegram客户端已启动

第二

In [13] client.connect()
Run Code Online (Sandbox Code Playgroud)

TelegramClient 已激活

这也会导致database is locked错误。更多信息:

  • 当它没有给出如何结束此错误的说明时,这怎么是一个可以接受的答案?! (5认同)
  • 亲爱的@Foad,他问**为什么数据库被锁定?**我解释了原因! (3认同)

Foa*_*oad 5

为解决臭名昭著的问题

操作错误:数据库已锁定

sqllite3引起的错误,一个解决方案是找到<SESSION_NAME>.session第一次运行代码时创建的文件并将其删除。Telethon 将这些文件放在与 Python 代码或 Jupyter Notebook 相同的文件夹中。或者,您可以使用 Python 自动删除该文件:

import os
import sys
os.chdir(sys.path[0])

if f"{SESSION_NAME}.session" in os.listdir():
    os.remove(f"{SESSION_NAME}.session")
Run Code Online (Sandbox Code Playgroud)

假设您使用SESSION_NAME字符串变量来存储函数的会话名称参数TelegramClient()

  • 请注意,这不应该在成品中完成,否则您将不得不每次重新登录,并且很快就会在最后几天遇到洪水等待。 (4认同)
  • 亲爱的@Lonami,你是对的。但我一直无法找到更好的方法来解决“OperationalError:数据库已锁定”问题。您有更好的建议吗? (2认同)
  • 如果您运行代码两次并且忘记调用“disconnect”,那么**是**它可能会出错。但是,如果您完全断开连接,则不应发生此错误,并确保没有两个实例同时运行。 (2认同)