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

How to divide unique data from an sql server to two different computers

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

我试过:

"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 lock tables,但您需要将查询更新为:

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 循环。