Как разделить уникальные данные с сервера SQL на два разных компьютера - PullRequest
0 голосов
/ 23 октября 2019

Я хочу использовать несколько компьютеров для запуска скрипта Python. Я бы хотел передать уникальные данные из mysql на каждый компьютер, на котором запущен скрипт. У меня есть полу-рабочее решение, но проблема в том, что когда два сценария запускают его одновременно, прежде чем любой из них сможет обновить столбец состояния до «обработки», он выберет те же данные.

Я пытался:

"SELECT * FROM table WHERE status IS NULL FOR UPDATE"

, но это, казалось, просто полностью блокировало мое второе соединение из базы данных, не позволяя ему извлекать данные ниже него для обработки.

Я также попробовал приведенный ниже код, который работает, но только если 2 сценария не пытаются получить доступ к БД одновременно.

vids = []
ids = []
c.execute('SELECT video_id,url FROM videos WHERE status IS NULL LIMIT 100;')
data = c.fetchall()
for row in data:
    vids.append((row[1],row[0]))
    ids.append(row[0])

c.executemany('UPDATE videos SET status="processing" WHERE video_id=%s;', ids)
db.commit()

Я бы хотел, чтобы каждый компьютер получал уникальныйнаборы данных для обработки. Сценарий 1 захватывает 1-100, сценарий 2 захватывает 101-200, сценарий 3 захватывает 201-300 и т. Д.

Спасибо за помощь! Хорошего дня!

1 Ответ

0 голосов
/ 23 октября 2019

Вот мое предложение

вы можете использовать mysql таблицы блокировки , но вам нужно обновить свой запрос до:

c.execute('lock tables videos; UPDATE videos SET status="processing" WHERE video_id in (select t1.video_id from (select video_id, row_number() over (order by video_id) as rn from videos where coalesce(status, '') = '') as t1 where rn <= 100); unlock tables;')

это решение применимо только для mysql versionn 8.0 up.

вам не нужен цикл for для этого.

...