Python 3.x Telethon:操作错误:数据库已锁定

Python 3.x Telethon:操作错误:数据库已锁定,python-3.x,telegram,telethon,Python 3.x,Telegram,Telethon,如果这是一个愚蠢的问题,我会道歉 我第一次尝试telethon,但它无法与我的电报API同步 键入此代码时,我会得到一个IP地址: 但当我尝试连接以启动或连接客户端时,会收到以下消息: 最后,我得到操作错误:当我尝试使用手机登录时,数据库被锁定错误 完整显示错误消息: -------------------------------------------------------------------- OperationalError Traceback (most recent

如果这是一个愚蠢的问题,我会道歉

我第一次尝试telethon,但它无法与我的电报API同步

键入此代码时,我会得到一个IP地址:

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

最后,我得到
操作错误:当我尝试使用手机登录时,数据库被锁定
错误

完整显示错误消息:

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

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
--------------------------------------------------------------
操作错误回溯(最近的
最后一次呼叫)
在()
1来自telethon导入电报客户端,同步
---->2客户端=电报客户端(“会话名称”、api id、api哈希)
3.
4.client.connect()
5如果不是客户端。用户是否已授权()
/蟒蛇A3/lib/python3.7/现场-
packages/telethon/client/telegramebaseclient.py in_u__________(self),
会话、api\U id、api\U哈希、连接、使用ipv6、代理、超时、,
请求重试、连接重试、重试延迟、自动重新连接、,
顺序更新、泛洪睡眠阈值、设备型号、,
系统版本,应用版本,语言代码,系统语言代码,循环,
基本(U记录器)
221默认DC\U ID,
222默认的\u IPV6\u IP如果是self.\u使用\u IPV6 else
默认的\u IPV4\u IP,
-->223默认_端口
224             )
225
/anaconda3/lib/python3.7/site-packages/telethon/sessions/sqlite.py
在set_dc中(自身、dc_id、服务器地址、端口)
184 def set_dc(自身、dc_id、服务器地址、端口):
185 super().set_dc(dc_id、服务器地址、端口)
-->186自我更新会话表()
187
188#获取与此数据中心对应的身份验证密钥
/anaconda3/lib/python3.7/site-packages/telethon/sessions/sqlite.py
在更新会话表中(self)
205#在保存身份验证密钥之前还要做一些工作
对于
206#多个DCs。可能会有不同的做法。
-->207 c.execute(‘从会话中删除’)
208 c.execute('在会话中插入或替换值
(?,?,?,?)', (
209自我证明文件,
操作错误:数据库已锁定
协同路由对象AuthMethods.\u从开始是什么意思? 为什么数据库被锁定?

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

您正在同时使用来自多个客户端的相同
会话
文件

首先

In [9] client.start()
客户端已启动

In [13] client.connect()
客户端已经激活了


这也会导致数据库被锁定错误。

这里有两个问题,第一个问题与身份验证有关。我想,我将讨论数据库锁定问题:

您传递的会话名称已在使用中或处于活动状态,因此被锁定

如果您使用字符串作为参数(如此处所述)并传递“name”,则它将成为会话文件名,这是创建会话的一种方法

另外,您可以使用telethon.sessions.abstract.Session对象并将其作为参数传递,这是第二种方法

第三种方法,你可以一个也不通过

如果为None,则不会保存会话,完成后应调用log_out()

client =  TelegramClient(None, api_id, api_hash)
希望这有帮助。

解决这个臭名昭著的问题

操作错误:数据库已锁定

sqllite3导致的错误,一种解决方案是找到第一次运行代码时创建的
.session
文件并将其删除。Telethon将这些文件与Python代码或Jupyter笔记本放在同一文件夹中。或者,您可以使用Python自动删除该文件:

导入操作系统
导入系统
os.chdir(系统路径[0])
如果os.listdir()中的f“{SESSION_NAME}.SESSION”:
删除(f“{SESSION_NAME}.SESSION”)

假设您正在使用
SESSION\u NAME
string变量来存储
TelegramClient()的SESSION NAME参数
函数。

好的,它不再给我
数据库被锁定
,但它仍然给我这个错误
/anaconda3/lib/python3.7/site packages/ipykernel\u launcher.py:1:RuntimeWarning:coroutine'DialogMethods.get\u dialogs'从未等待过“”"启动IPython内核的入口点。
当它没有给出如何结束此错误的指示时,这是一个可接受的答案吗?!亲爱的@Foad,他问为什么数据库被锁定?我解释了原因!请注意,这不应该在成品中完成,否则每次都必须重新登录,并点击flood waits最近几天很快。亲爱的@Lonami,你说得对。但是我还没有找到更好的方法来解决
操作错误:数据库被锁定
问题。你有更好的建议吗?这里接受的答案可能是好的。只要确保你只为一个会话创建一个客户端。对不起,我没有使用Jupyter或IPython使用Telethon之前足以解决此问题。如果您运行代码两次并忘记调用
断开连接
,则很可能是错误。但如果您完全断开连接,则不应发生此错误,确保没有两个实例同时运行。