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

问题描述 投票:0回答:7

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

我第一次尝试 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

协程对象AuthMethods._start at是什么意思? 为什么数据库被锁定?

python-3.x telegram telethon
7个回答
5
投票

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

在您的情况下,您同时使用来自许多 TelegramClient 的相同

session
文件。

第一

In [9] client.start()

Telegram客户端已启动

第二个

In [13] client.connect()

TelegramClient 已激活

这也会导致

database is locked
错误。 更多信息:


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")

假设您使用

SESSION_NAME

 字符串变量来存储 
TelegramClient()
 函数的会话名称参数。


2
投票
你这里有两个问题,我猜第一个问题与身份验证有关,我将讨论数据库锁定问题:

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

如果您使用字符串作为参数,则它会成为会话文件名,就像这里您传递了“名称”,这是创建会话的一种方法。

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

第三种方法,你可以简单地传递 None 。

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

client = TelegramClient(None, api_id, api_hash)

希望这有帮助。


2
投票
您可以检查会话的活动进程,如果有,则在启动客户端之前关闭它们

pid = check_output(['fuser', 'anon.session']) if pid: check_output(['kill', pid])
    

0
投票
如果您只是需要在 Linux 中解决此问题并再次运行程序,请按照以下步骤操作。

第 1 步 - 找到会话文件。您可以在保存 python 脚本的同一目录中找到一个名为 xxxxxxxxx.session 的文件。

步骤 2 - 运行

fuser xxxxxxxxx.session

(将 xxxxxxxxx.session 替换为步骤 1 中找到的文件名)

第 3 步 - 您将看到带有整数的响应(例如 - 590219)

第 4 步 - 运行

kill -9 590219

(将 590219 替换为第 3 步中找到的整数)

现在再次运行你的程序


0
投票
只需关闭计算机然后再打开即可:)

你可以尝试

fuser anon.session

找到进程ID并使用kill命令杀死它,比如kill -9 PID

但是据说关闭并打开电脑仍然是最简单的选择


-3
投票
如果您在

client.start()

'if __name__ == '__main__':'
,则无法登录电报应用程序,并且您将

“操作错误:数据库已锁定”。您必须在 client.start() 之前删除 'if

name == 'main''

© www.soinside.com 2019 - 2024. All rights reserved.