• Как оптимизировать запрос?

    @o5a
    lil_koi, по поводу долгого исполнения создания индекса, может быть еще какая-то особенность DataGrip. Попробуйте DBeaver (есть бесплатная Community Edition), хорошо с Postgres работает, подобных проблем не замечалось.

    По поводу изначального кода еще:
    1) не надо делать commit после каждой команды, сделайте в конце, после массовых изменений.
    Точнее, некую середину выбрать, как предложили уже, хотя бы не чаще каждых 100 команд.
    2) если есть возможность, лучше минимизировать количество таких вызовов update через код python именно, т.е. предварительно сгруппировать данные так, чтобы по каждому диапазону дат получался только один вызов update.
    3) можно свою таблицу данных погоды по дням сначала загрузить в отдельную таблицу в базе, а потом уже средствами SQL сделать update одной командой, напрямую выбирая данные из самой базы. Такое как правило обрабатывается гораздо быстрее, чем повторный вызов update через курсор питона.
    Написано
  • Как выводить цифры числа слева направо?

    @o5a
    Вам ведь в прошлом вопросе уже привели варианты решения этой задачи.

    А в текущем коде вы как будто написали, не представляя, что делаете.
    for i in range(10):
    ....
            if n1 % 10 == i:

    Просто последовательно перебираете числа в надежде, что в таком порядке они совпадут с остатком от деления. Тут в целом метод решения неправильный.
    Написано
  • Как хранить большие объёмы текста?

    @o5a
    Tiubert,
    (насчет подстановки данных с помощью "?") я не заметил в моём случае разницы между подстановкой данных и более мне привычными f-строками.

    Разница в том, что 1) метод подстановки через форматирование небезопасен (если не делать доп. проверки, можно вот так подставить пришедший код на SQL, который исполнится) 2) с ним потребуется дополнительное форматирование данных, если захотите вставить скажем текст с кавычками, или еще какими спецсимволами.
    В случае с подстановкой данных можно использовать executemany, чтобы сразу организовать вставку нескольких записей.

    Насчет primary key я почитал в документации, я понял его "задачу" - каждая строка имеет свой уникальный идентификатор, но не до конца понял "а почему я так не могу?". После добавления primary key в таблицу добавляется просто еще одно правило которое (возможно) никак не сказывается на, например, поиске строки с указанным id: как было WHERE id = 1 так и осталось.

    primary key (PK) нужен как раз для того, чтобы не задавать эти идентификаторы вручную.
    Т.е. вместо того, чтобы самому следить за уникальностью id при вставках вида
    cursor.execute("INSERT INTO table1(id, embed) VALUES (?, ?)", (1, supertext))

    Поле id заводится как primary key и вставка делается без явного задания этого поля, оно автоматически будет инкрементироваться
    cursor.execute("INSERT INTO table1(embed) VALUES (?)", (supertext, ))


    Но нужно понимать, для чего у вас это поле id. Если это просто уникальная позиция записи в таблице, то лучше и использовать автоматическую генерацию PK. Если же вы хотите его вести как некий однозначный код, когда знаете, что под кодом 1 у вас всегда "О великий текст, ....", под кодом 2 другой определенный текст и т.д., то автоинкремент для данного поля уже не нужен. Но даже в этом случае лучше развязать между собой сущности: PK автоматический инкремент отдельно (то поле id), код отдельно (назначаемый явно вручную). Это будет лучше, если потом захотите связывать эту таблицу с другими по ключам. Но если планируется все проще, скажем это будет просто одна таблица без лишних связей, то можно и не усложнять.
    Написано
  • Как хранить большие объёмы текста?

    @o5a
    Tiubert, для текстового поля можно просто писать тип text, т.к. по сути в sqlite всё к нему сводится.

    Для работы с БД лучше сразу научитесь использовать параметризованные запросы с подстановкой данных средствами самой системы (через использование "?") вместо ручного форматирования:
    https://docs.python.org/3/library/sqlite3.html#sql...

    Т.е. вместо
    cursor.execute(f"INSERT INTO table1 VALUES (1, '{supertext}')")

    Использовать
    cursor.execute("INSERT INTO table1 VALUES (?, ?)", (1, supertext))


    Поле для первичного ключа (id) можно не задавать самому, а генерировать автоматически, если задать его как
    int primary key
    https://www.sqlite.org/lang_createtable.html#rowid
    Написано
  • Что будет с моим кодом если я удалю, и скачаю заново питон 3.9.5?

    @o5a
    Александр Македонский, сам питон на windows ставится по умолчанию просто в папку c:/python39 (в случае с вашей версией), и при удалении соответственно удаляются файлы только внутри этой папки.
    Если вы свои скрипты не держите внутри этой папки (или какую другую вы выбирали для установки), а в какой-то другой, то при переустановке с ними ничего не будет.
    Есть еще момент, что если не пользуетесь виртуальным окружением (venv и т.п.), а модули ставите просто для всех, то перед удалением предыдущей версии питона стоит сохранить список всех установленных модулей с их версиями, чтобы потом заново их накатить

    pip freeze > reqs.txt
    создаст список всех установленных модулей с их версиями в этом файле reqs.txt
    и затем после установки новой версии можно просто установить все то, что и было до этого
    pip install -r reqs.txt

    Но это нужно только если не пользуетесь виртуальным окружением для своих проектов.
    Написано
  • Как создать правильно API запрос на Python?

    @o5a
    Анастасия, это обычная работа с вложенными данными. В данном случае у вас список, внутри которого словарь. Т.е. сначала достаете первый (нулевой) элемент списка, затем уже в нем достаете значение по ключу "event".
    Написано
  • Как оптимизировать запрос через Sqlalchemy?

    @o5a
    WishesFire, откуда вообще берется filter_body? Сколько записей в filter_body.prj_ids когда тот запрос начинает так сильно тормозить, и сколько записей всего в основной таблице?
    Написано
  • Какова верная реализация множественного выбора в SQLite через LIKE и REGEXP (Python)?

    @o5a
    Vindicar, обычно средствами SQL так и проверяется. Но при желании можно и через regexp
    WHERE word REGEXP '^А-ЯЁA-Z'
    'Ё' нужно отдельно указывать, т.к. в диапазон А-Я не входит.
    Но при наличии upper как-то мало смысла в этом.
    Да и базово sqlite вроде regexp не поддерживает, его нужно отдельно ставить, или самому функцию создавать через re.
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, Да, что-то этим упоминанием больше запутали. Т.е. помимо обычных команд просто хотите чтобы срабатывало и от формата с упоминанием. Само упоминание насколько я понимаю в данном случае не важно для обработки, все равно важен только id. В таком случае насколько я понимаю, можно без regexp обойтись, просто методами самого vkbottle.
    Вместо всего этого
    @bot.on.message(text=["Призми погладить", "Рп погладить", "[id{user_id}|Фурина]"])
    async def pat_user(message: Message):
        # Проверяем, было ли упоминание пользователя через @
        mentioned_user_id = None
        mentioned_users = re.findall(r'\[id(\d+)\|.*?\]', message.text)
        if mentioned_users:
            mentioned_user_id = mentioned_users[0]

    Просто напрямую прописать этот формат в хэндлере, и затем использовать найденные им значения в функции
    @bot.on.message(text=["Рп погладить [id<mentioned_user_id>|<mentioned_user_name>]", "Призми погладить", "Рп погладить"])
    async def pat_user(message: Message, mentioned_user_id=None, mentioned_user_name=None):
        mentioned_user_id ... # уже можно использовать напрямую
        # можно и само имя использовать, если вдруг пригодится mentioned_user_name

    Так должно работать для "Рп погладить [idxxx|кто-тотам]", для второго аналогично сделать.
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, проверку наличия найденного значения пропускать тоже не надо, которую до этого делали. Без нее конечно будет в ошибку уходить, если присылать сообщение, в котором вообще нет такого кода
    mentioned_users = re.findall(r'\|@(.+?)\b', message.text)
    if mentioned_users:
        mentioned_user_id = mentioned_users[0]

    Если же эту ошибку выдает даже на "правильном" сообщении с указанием пользователя, то приведите полный текст того сообщения, в котором пользователь есть, но не находит.
    Написано
  • Откуда эти 2 значения?

    @o5a
    Потому что
    s = pop.x = x + 1
    означает
    s = x + 1
    pop.x = x + 1
    Т.е. это не то же самое, что
    s = pop.x + 1

    Когда первый раз запускается gls() и доходит до import pop, она импортирует саму себя и снова запускает gls(). Внутри нее pop.x это и есть x, поэтому после того, как первый раз печатает x, она печатает x в области видимости импортированного pop, поэтому он увеличен на 1. Когда же заканчивает обработку импортированного и второй раз печатает x, то это уже локальный x, который не увеличивался.

    А вообще импорт самого себя лучше не делать в реальном коде, разве что делаете это для изучения особенностей языка. Иначе лишние проблемы себе создадите.
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, я думал, поймете сами, что там не просто text, а message.text, я же просто показывал шаблон
    mentioned_users = re.findall(r'\|@(.+?)\b', message.text)
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, если все-таки хотите из текста 'Рп погладить [id559313892|@valia_frosya]' доставать именно 'valia_frosya', то так:
    mentioned_users = re.findall(r'\|@(.+?)\b', text)
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, т.е. получается, что в тексте с упоминанием всегда будет использован idxxx ? Тогда достаточно только его и искать, вообще не важно, кто там в подмене:
    mentioned_users = re.findall(r'\[id(\d+)', text)
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, Т.е. все-таки в самом тексте квадратных скобок нет. Я не особо в курсе, как в vk отображается "перекрытие именем", если там как раз и идет id12345, то можно так:
    mentioned_users = re.findall(r'(?:id|@)(.+?)\b', message.text)
    mentioned_users[0]
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, как именно это в тексте будет выглядеть? Так в скобках и будут писать что ли? Или все-таки текст будет в таком виде: "Погладить id1235", "Погладить @vredinka_panda"?
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, зачем вы строку поиска regexp (шаблон) в квадратные скобки заключаете? У них другое назначение. Указанное у вас '\[id(\d+)]' будет искать строку вида ".... [id12345]"
    В тексте вопросе же вроде речь шла про "... @id12345". Какого вида текст тогда все-таки использовать планируется?
    Написано
  • Как использовать команду через @?

    @o5a
    kreyzi, не совсем понятно, в чем именно вопрос? Помочь правильно написать regexp, который бы из текста вида "что-то там @id12345 и так далее" вытащил "12345", я так понимаю это пытались сделать? Если так, то достаточно "@id(\d+)"
    Написано
  • Почему через psycopg2 не могу получить список таблиц в postgres?

    @o5a
    lisi4ka, А до изменения получается порт пустой был? 5432 итак является портом по умолчанию, так что если не указывать, а потом указать 5432 это будет одно и то же соединение, один сервер. Возможно что-то еще параллельно изменили.
    Написано
  • Почему через psycopg2 не могу получить список таблиц в postgres?

    @o5a
    lisi4ka,
    Я под тем же пользаком сижу в dbeaver и он там может CRUD. Но не может создать запись в таблице т.к. не может её найти.

    Под "может CRUD" подразумеваете, что может менять записи в таблицах, но не тех, что нужны, т.е. из схемы public?
    Что будет, если в DBeaver (и потом скрипте) от этого пользователя просто делаете запрос

    select* from public.название_той_таблицы

    Если пользователь не видит нужных таблиц в information_schema, значит у него как раз нет на них прав. Также и прямой select из этой таблицы сразу покажет. что нет прав.

    По вашему описанию также похоже, что в DBeaver и скрипте соединяетесь или под разным пользователем, или все-таки к разным базам.
    Написано