Как получить и тут же удалить содержимое ячейки MySQL из Python3?

Рейтинг: 1Ответов: 1Опубликовано: 13.07.2023

Есть БД MySQL и Python3 программа, работающая с этой БД. Так же есть некоторая последовательность чисел, которая должна быть неким образом записана в БД (я предполагаю, что существует возможность того, что между получением чисел, и их обработкой программа может быть перезапущена/закрыта, поэтому они хранятся в БД).

В программе есть 2 функции, одна из которых периодически дописывает новое число в последовательность, другая же должна в определенный момент обработать всю записанную на данный момент последовательность, но лишь 1 раз, поэтому я хочу тут же удалить последовательность из БД.

Пытаюсь понять как это оформить, чтобы превентивно устранить вероятность варианта, когда сначала функция2 получает, потом функция1 дописывает туда число, и потом удаляется содержимое, т.е. что одно или более чисел, дописанных в конец последовательности будет утеряно.

Как будет правильнее - отправить из Python команды SELECT и UPDATE SET NULL в MySQL так, чтобы MySQL выполнил их сразу подряд, отложив выполнение других команд с ячейкой на после? Если это возможно? Или это лучше "во избежание" оформлять полноценной таблицей, с Index и удалением по конкретным Index при том, что когда чего то добавляется у него уникальный еще больший Index? Не хотелось бы, как бы целая таблица против 1 ячейки...

Как я себе это, примерно, понимаю (я это пока что не тестировал, возможность будет сильно позже, но это же не мешает обдумывать?). Возможно ли лучше?

update_query = """
SELECT column
FROM table
WHERE
    row = 'what_I_need'

UPDATE
    table
SET
    column = NULL
WHERE
    row = 'what_I_need'
"""

...

        with connection.cursor() as cursor:
            for result in cursor.execute(update_query, my_string):
                    print(my_string)

Ответы

▲ 2Принят

Возможная реализация.

Создаём таблицу для хранения чисел:

CREATE TABLE numbers (
  one_number INT,
  processing ENUM ('not processed', 'processing', processed) DEFAULT 'not processed'
);

Процесс 1 записывает в таблицу данные запросами типа:

INSERT INTO numbers (one_number) VALUES (1);
INSERT INTO numbers (one_number) VALUES (2), (3);
INSERT INTO numbers VALUES (4, DEFAULT);
INSERT INTO numbers (one_number) SELECT some_number FROM another_table;

Процесс 2 сначала помечает записи на обработку

UPDATE numbers SET processing = 'processing' WHERE processing = 'not processed';

затем обрабатывает, после чего помечает обработанные записи

UPDATE numbers SET processing = 'processed' WHERE processing = 'processing';

DEMO с пояснениями.