Telethon: OperationalError: database is locked
Telethon: OperationalError: database is locked
如果这是一个愚蠢的问题,我们深表歉意。
我第一次尝试 telethon,它无法与我的电报同步 API。
我在键入此代码时获得了一个 IP 地址:
但是当我尝试连接以启动或连接客户端时收到此消息:
最后,当我尝试使用 phone 登录时出现 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 是什么意思?
为什么它给数据库锁定?
参考Telethon文档,如果您没有正确关闭数据库,数据库将被锁定。
在您的情况下,您同时使用来自多个 TelegramClient 的相同 session
文件。
第一
In [9] client.start()
TelegramClient 已启动
第二
In [13] client.connect()
TelegramClient 已经激活
这也会导致 database is locked
错误。 More info:
你有两个问题,我想第一个问题与身份验证有关,我将讨论数据库锁定问题:
您传递的会话名称已被使用或处于活动状态,因此已被锁定。
如果你像这里传递的那样使用字符串作为参数,它将成为会话文件名"name",这是创建会话的一种方法。
否则您可以使用 telethon.sessions.abstract.Session 对象并将其作为参数传递,这是第二种方式。
第三种方式,你可以简单地传递None。
如果是None,session不会被保存,完成后调用log_out()
client = TelegramClient(None, api_id, api_hash)
希望对您有所帮助。
解决臭名昭著的
OperationalError: database is locked
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()
函数的会话名称参数。
如果您在 'if __name__ == '__main__':'
中 client.start()
,则无法登录电报应用程序,您将拥有
'OperationalError: database is locked'. You must delete 'if name == 'main'' before client.start()
您可以检查会话的活动进程,如果有,则在启动客户端之前关闭它们
pid = check_output(['fuser', 'anon.session'])
if pid:
check_output(['kill', pid])
如果您只需要在 Linux 和 运行 程序中解决这个问题,请按照以下步骤操作。
第 1 步 - 找到会话文件。您可以在保存 python 脚本的同一目录中找到一个名为 xxxxxxxxx.session 的文件。
步骤 2 - 运行 fuser xxxxxxxxx.session
(将 xxxxxxxxx.session 替换为在步骤 1 中找到的文件名)
第 3 步 - 您将看到带有整数的响应(例如 - 590219)
第 4 步 - 运行 kill -9 590219
(将 590219 替换为第 3 步中找到的整数)
现在再次运行你的程序
如果这是一个愚蠢的问题,我们深表歉意。
我第一次尝试 telethon,它无法与我的电报同步 API。
我在键入此代码时获得了一个 IP 地址:
但是当我尝试连接以启动或连接客户端时收到此消息:
最后,当我尝试使用 phone 登录时出现 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 是什么意思? 为什么它给数据库锁定?
参考Telethon文档,如果您没有正确关闭数据库,数据库将被锁定。
在您的情况下,您同时使用来自多个 TelegramClient 的相同 session
文件。
第一
In [9] client.start()
TelegramClient 已启动
第二
In [13] client.connect()
TelegramClient 已经激活
这也会导致 database is locked
错误。 More info:
你有两个问题,我想第一个问题与身份验证有关,我将讨论数据库锁定问题:
您传递的会话名称已被使用或处于活动状态,因此已被锁定。
如果你像这里传递的那样使用字符串作为参数,它将成为会话文件名"name",这是创建会话的一种方法。
否则您可以使用 telethon.sessions.abstract.Session 对象并将其作为参数传递,这是第二种方式。
第三种方式,你可以简单地传递None。
如果是None,session不会被保存,完成后调用log_out()
client = TelegramClient(None, api_id, api_hash)
希望对您有所帮助。
解决臭名昭著的
OperationalError: database is locked
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()
函数的会话名称参数。
如果您在 'if __name__ == '__main__':'
中 client.start()
,则无法登录电报应用程序,您将拥有
'OperationalError: database is locked'. You must delete 'if name == 'main'' before client.start()
您可以检查会话的活动进程,如果有,则在启动客户端之前关闭它们
pid = check_output(['fuser', 'anon.session'])
if pid:
check_output(['kill', pid])
如果您只需要在 Linux 和 运行 程序中解决这个问题,请按照以下步骤操作。
第 1 步 - 找到会话文件。您可以在保存 python 脚本的同一目录中找到一个名为 xxxxxxxxx.session 的文件。
步骤 2 - 运行 fuser xxxxxxxxx.session
(将 xxxxxxxxx.session 替换为在步骤 1 中找到的文件名)
第 3 步 - 您将看到带有整数的响应(例如 - 590219)
第 4 步 - 运行 kill -9 590219
(将 590219 替换为第 3 步中找到的整数)
现在再次运行你的程序