Telethon:OperationalError:数据库已锁定

时间:2019-01-25 16:33:09

标签: python-3.x telegram telethon

很抱歉,这是一个愚蠢的问题。

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

当我输入以下代码时,我得到一个IP地址: enter image description here

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

enter image description here

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

enter image description here

完整的错误消息:

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

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的含义是什么? 为什么给数据库锁定?

3 个答案:

答案 0 :(得分:1)

请参阅Telethon文档,如果未正确关闭数据库,则会将其锁定。

您一次使用了许多TelegramClient的同一session文件。

第一

In [9] client.start()

TelegramClient启动

第二

In [13] client.connect()

TelegramClient已经处于活动状态

这也会导致database is locked错误。 More info:

答案 1 :(得分:1)

您在这里有2个问题,我想第一个问题与身份验证有关,我将谈论数据库锁定问题:

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

如果您使用字符串作为参数(例如在此处传递了“名称”),它将成为会话文件名,这是创建会话的一种方法。

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

第三种方式,您可以简单地通过None。

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

client =  TelegramClient(None, api_id, api_hash)

希望这会有所帮助。

答案 2 :(得分:0)

解决臭名昭著的

OperationalError:数据库已锁定

由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()函数的会话名称参数。