Можно использовать sqlite3 в асинхронном боте?

Всем привет.
Я пишу ботов для дискорда. Использую в своих ботах sqlite3.
Мне сказали, что при большом кол-во запросов будет выдавать ошибку Database is locked
И привели пример:

Есть одна девушка - файл SQLite3
И дох*ра мужчин - запросы

И эти мужчины пытаются все вместе в один момент вставить свой п*ловой *рган в девушку.

Правда ли это или ложь?
  • Вопрос задан
  • 3864 просмотра
Решения вопроса 2
SoreMix
@SoreMix Куратор тега Python
yellow
Правда, она однопоточная, и при попытке получить доступ с нескольких потоков выкинет ошибку о блокировке. Пока один поток обрабатывает данные - дб лочится. В принципе, сравнимо с попыткой открыть один файл два раза.

Лучше использовать полноценную базу данных как postgres, например. В ней и полей больше, и поддерживается доступ с нескольких потоков. sqlite3 это поиграться и для тестов, по сути это простое key-value хранилище с самыми примитивными данными: int, real, blob, text, как БД в словаре в .json файле.
Ответ написан
@DollaR84
Если ваша бд сильно нагружена, то действительно лучше использовать специализированные продукты типа postgres. Но в ином случае многие sqlite сильно недооценивают.
Эта база может и простая, но имеет много возможностей, о которых большинство и не задумываются.
Во первых, есть несколько вариантов указания работы с многопоточностью, указывается при сборке библиотеки, по умолчанию sqlite3.dll собрана с многопоточным доступом.
https://www.sqlite.org/threadsafe.html
Во вторых, у sqlite есть набор интересных ключей при открытии прагмы. Советую использовать, как минимум, journal_mode='wal'. Это освободит запросы чтения от ожидания завершения запросов записи.
Также есть прагма threads, указывающая сколько лимитов потоков можно создавать, по умолчанию стоит 0, можно увеличить данное число.
Со всеми прагмами можно ознакомиться тут: https://www.sqlite.org/pragma.html
В третьих, если вы работаете с базой не напрямую запросами, а через какую-то ORM, то у них тоже могут быть дополнительные опции для потокобезопасности. Например, в простой ORM peewee при открытии базы, наряду с прагмами можно также указать флаг: thread_safe=True. Не разбирал подробности как он работает, но думаю он использует в своей работе ту же прагму threads.
Поэтому все зависит от нагрузки и роли базы в ваших ботах. В некоторых задачах sqlite оправданный выбор. Надо подбирать инструмент под задачу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
HemulGM
@HemulGM Куратор тега Python
Delphi Developer, сис. админ
Достаточно организовать очередь запросов. Т.е. пока идёт один запрос, не позволять выполнять второй.
Если на бд нет большой нагрузки, то sqlite справится с этим.
В противном случае воспользуйтесь любой клиент-серверной БД.
Ответ написан
Комментировать
@akonovalov
Программист на компьютере
Не так давно работал с SQLite из Python 3.8 с aiohttp.
Использовал библиотеку aiosqlite.
Ошибок блокировки с ней не вылетало, при попытке писать параллельно - всё писалось, но с ожиданием. Судя по всему она умеет блокировать файл при записи кем-то одним и остальные "ждут".
Главное неудобство для меня было отсутствие нормального асинхронного ORM для работы с SQLIte,
хотя для своего класса задач (прототипы, малонагруженные и малоиспользуемые сервисы) - ИМХО вполне подходящее решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы