Telethon: OperationalError: база данных заблокирована
Извиняюсь, если это глупый вопрос.
Я пробую telethon впервые, и он не синхронизируется с моим 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? Почему это дает базу данных заблокирована?
6 ответов
Ссылаясь на документацию Telethon, база данных будет заблокирована, если вы не закроете ее должным образом.
Вы используете тот же session
файл от многих TelegramClient одновременно.
Первый
In [9] client.start()
TelegramClient запущен
второй
In [13] client.connect()
TelegramClient уже активен
Это также вызывает database is locked
ошибка. Больше информации:
Чтобы решить печально известную
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()
функция.
перед созданием сеанса
pid = check_output(['fuser', 'anon.session'])
if pid:
check_output(['kill', pid])
У вас здесь 2 проблемы, первая проблема связана с аутентификацией, я думаю, я расскажу о проблеме блокировки базы данных:
Имя сеанса, которое вы передали, уже используется или активно, поэтому заблокировано.
Он становится именем файла сеанса, если вы используете строку в качестве параметра, например, здесь вы передали "имя", это один из способов создания сеанса.
в противном случае вы можете использовать объект telethon.sessions.abstract.Session и передать его в качестве параметра, это второй способ.
И в-третьих, вы можете просто передать None.
Если это None, сеанс не будет сохранен, и вы должны вызвать log_out(), когда закончите.
client = TelegramClient(None, api_id, api_hash)
Надеюсь это поможет.
Если вам просто нужно избавиться от этой проблемы в Linux и снова запустить программу, выполните следующие действия.
Шаг 1 - Найдите файл сеанса. Вы можете найти файл с именем xxxxxxxxx.session в том же каталоге, где у вас сохранен скрипт python.
Шаг 2 - запустить
fuser xxxxxxxxx.session
(замените xxxxxxxxx.session именем файла, найденным на шаге 1)
Шаг 3 - Вы увидите ответ с целым числом (Пример - 590219)
Шаг 4 - Запуск
kill -9 590219
(замените 590219 целым числом, найденным на шаге 3)
Теперь снова запустите вашу программу
Если ты
client.start()
в
'if __name__ == '__main__':'
, вы не можете войти в приложение Telegram, и у вас будет
OperationalError: база данных заблокирована. Вы должны удалить 'if name =='main'' перед client.start()