Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Как работают явные блокировки в PostgreSQL?

    @Jack444
    Представь что под капотом есть некая очередь транзакций.
    Если несколько транзакций пытаются модифицировать один и тот же ресурс, PostgreSQL обрабатывает их по принципу "первый пришёл — первый обслужен".
    Например:
    Транзакция A изменяет строку и удерживает блокировку.
    Транзакция B пытается изменить ту же строку и переходит в состояние ожидания.
    Когда Транзакция A завершается (COMMIT или ROLLBACK), блокировка снимается, и Транзакция B получает доступ.
    Ответ написан
    Комментировать
  • Как организовать структуру базы данных для нескольких типов пользователей?

    @Jack444
    Таблицы client/agent/user_data можно в одну таблицу user упаковать, + добавить поля is_client bool и is_agent bool, но так как вы уже сделали связь к role то перекидывайте туда роли client и agent, если возможно использование нескольких ролей для пользователя то используйте не name varchar a names varchar[] чтобы поле было массивом.
    Ещё обычно создаётся таблица permissiion которая привязывается к ролям и юзерам + дополнительно хранит поля table_name и action, либо вместо таблицы типом JSONB добавить ячейку в роли и юзеры.
    Вообще postgre изначально умеет работать с пользователями и можно использовать такие фичи как CREATE USER и ALTER ROLE но такой вариант может оказаться костыльным и логику с правами лучше перекинуть на уровень приложения.
    Ответ написан
  • Как оптимизировать пагинацию отсортированных по времени создания записей?

    @Jack444
    Просто сделать такой индекс.
    CREATE INDEX dtidx ON table (id, created DESC);
    И всё, запрос будет искать id в первичном индексе, как найдёт там будет уже список таймштампов отсортированных по убыванию сделать по ним offset/limit вообще не чего не стоющая операция, ORDER BY писать уже не обязательно.
    Ответ написан
    Комментировать
  • Как поменять кодировку базы данных с 'latin-1' на 'utf-8'?

    @Jack444
    Надо на чистом сервере апгрейдить ОС и после устанавливать постгре. Скорее всего в системе по дефолту latin-1 стоит и utf-8 локалы не установлены.
    Отправьте в терминал такую команду
    localectl status
    Покажет локализацию устройства, если заканчивается на .UTF-8 то всё ок.
    Если нет то пробуйте обновить.
    update-locale LANG=ru_RU.UTF-8
    Если выходит ошибка invalid locale settings то обновите всю ОС
    В убунту/дебиан такая команда
    apt upgrade
    В процессе апргрейда появится окошко с выбором кодировок, выберите любых несколько которые оканчиваются на .UTF-8

    затем идёте в постгре
    sudo -i -u postgres psql
    и отправьте такую команду
    UPDATE pg_database SET encoding = pg_char_to_encoding('UTF8');
    Ответ написан
    2 комментария
  • Как исправить ошибку в PostgrSQL(asyncpg)?

    @Jack444
    async def user_exists(user_id):
        conn = await asyncpg.connect(host=host, user=user, password=password, database=database)
        try: return await conn.fetchrow(f"SELECT 1 FROM users WHERE (user_id=} LIMIT 1")
        finally: await conn.close()
    Ответ написан
  • Что лучше при архитектуре базы данных?

    @Jack444
    Если бд строите под энтерпрайз левел и у вас планируются милиарды строк в таблицах то вполне годно добавлять префиксы и группы таблиц скидывать на отдельные сервера а после на уровне приложения менеджить запросы к нужным серверам, но скорее всего лучше посмотреть в сторону кликхаус, ядб или носиквел базы которые умееют горизонтально масштабироваться и сами распределяют данные по серверам.
    Если данных в таблице планируется набор строк до сотни милионов то схема 1 сущность=1 таблица отличный вариант
    Ответ написан
    Комментировать
  • Почему при наличии пробелов в строке PostgreSQL выдаёт ошибку (Psycopg2, Python)?

    @Jack444
    import psycopg2
    E = lambda field: f'$myseckey${field}$myseckey$' if type(field) is str else field
    with connection.cursor() as cursor:
            cursor.execute(
                f"""INSERT INTO data(photo_avatar,
                                     name,
                                     type,
                                     reach,
                                     engagemant_er,
                                     engage_percent)
                                     VALUES ({E(profile_name)}, 'N\A', {E(reach)}, {E(engagement)}, {E(engage_per));"""
                )
            
        connection.commit()
    Ответ написан
    Комментировать
  • Как сделать класс БД с asyncpg?

    @Jack444
    А зачем тебе __del__? Ищи в любом фреймворке события startup и shutdown, через них открывай и закрывай коннекты
    Ответ написан
    Комментировать
  • Как правильнее сделать проверку на присутствие строки в таблице?

    @Jack444
    uid = message.from_user.id
    if await sql.fetchrow(f'SELECT True FROM users WHERE id={uid} LIMIT 1'):
        ...
    else: 
        ...
    Ответ написан
    Комментировать
  • Почему psycopg2 выдает ошибку psycopg2.ProgrammingError: no results to fetch?

    @Jack444
    А причем здесь потоки? Драйвер же говорит что ему нечего извлечь. Например ты делаешь запрос update или insert которые нечего не возвращают а ты пытаешься что-то от туда извлечь.
    Ответ написан