Задать вопрос
Hackerman1
@Hackerman1
17 лет, плохое зрение.

Где мне указать db.connect(), чтобы он распространился на весь проект?

Здравствуйте. Я использую библиотеку peewee в качеств ОРМ для бота. Когда там действие доходит до взаимодействия с таблицами, то есть, .get или .create, то это может занимать до 15-20 секунд. Я предполагаю, что это связано с открытием соединения с БД. Если нет, то поправьте меня, пожалуйста. Модели находятся в отдельном файле, они импортируются в другие нужные места и там происходят get/create методы. Я попробовал открыть соединение единожды в самих моделях единожды, потому что я не знаю, как оно будет себя вести при импортах и мало ли будет несколько соединений конфликтовать и лочить БД. Не кидайтесь тапками за такие непонятки)

Код типо инициализации БД
def initialize_db():
    global db_initialized
    if not db_initialized:  # Проверяем, инициализирована ли база данных
        db.connect()
        db.create_tables([Referrer, Channels, BotTexts], safe=True)
        db_initialized = True  # Устанавливаем флаг в True

Пример применения моделей
def start_message(message):
    chat_id = message.chat.id
    args = extract_arguments(message.text)

    if Referrer.does_referrer_exist(chat_id):
        bot.send_message(chat_id, BotTexts.get(text_id=3).text)
        return

    if args:
        if Referrer.is_already_reffered(chat_id):
            bot.send_message(chat_id, BotTexts.get(text_id=4).text)
            bot.set_state(chat_id, UserState.AWAITING_NICKNAME, chat_id)
            return
        else:
            user = Referrer.get(user_id=int(args))
            user.add_referred_user(chat_id)
            bot.send_message(args, BotTexts.get(text_id=5).text)

Если дело действительно в длительном соединении с БД, то в каком файле мне нужно это сделать, чтобы соединение было для всех взаимодействий? Если же не в этом дело, то в чем? Если вдруг надо дополнить инфу, код - пишите, дам всё, что надо. Кроме токена :)
  • Вопрос задан
  • 235 просмотров
Подписаться 2 Простой 7 комментариев
Решения вопроса 1
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
залез в доку
не работал с данной либой, но скорее всего вам надо воспользоваться https://docs.peewee-orm.com/en/latest/peewee/api.h...
Create a context-manager that will hold open a connection for the duration of the wrapped block.

ну и как (нафантазирую) пример кода (напоминаю, что с данной либой я не работал и могу ошибаться, это просто согласно документации)
rom peewee import *
db = SqliteDatabase('people.db')

def on_app_startup():
    with db.connection_context():
         if  db.create_tables([Referrer, Channels, BotTexts], safe=True):
                db_initialized = True
         #выполнение функций которые должны работать в контексте базы, помня, что контекст закроется как только в коде вы выйдете за "with db.connection_context()"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rickshaw
Судя по примерам в первой странице доки надо делать объект db глобальным, и вызывать connect() при старте приложения

rom peewee import *

db = SqliteDatabase('people.db')

def main():
    db.connect()
    # запуск приложения
    # закрыть соединение (вероятно db.close())


возможно стоит закрывать соединение не в конце main, а по другому, но я не помню, как в питоне это стоит делать
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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