如何将唯一数据从 SQL 服务器划分到两台不同的计算机



我希望使用多台计算机来运行python脚本。我想将唯一数据从 mysql 提供给运行脚本的每台计算机。我有一个半工作的解决方案,但问题是当 2 个脚本同时运行它时,在任何一个可以将状态列更新为"处理"之前,它将选择相同的数据。

我试过:

"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,依此类推。

感谢您的帮助!祝你有美好的一天!

这是我的建议

您可以使用 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

你不需要 for 循环。

最新更新