我有一个名为 tbltest 的数据库,它有 4 列:Id、Fname、Lname、Iscategorized。我必须将数据从它的前三列复制到另一个数据库 tblcopy,它有 4 列:Id、Fname、Lname、Service_number。我仅在 Iscategorized 为 0 时才复制数据,复制后,我将其更新为 1。服务列告诉正在复制数据的 python 服务。以下是我使用服务 1 进行复制的代码。
import time
var = True
while var == True:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","root","amanbaweja","test" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
sql = "SELECT * FROM tbltester\
WHERE iscategorized = '%d'" % (0) + " limit 0,1 "
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
id = row[0]
fname = row[1]
lname = row[2]
iscategorized = row[3]
# Now print fetched result
print "id=%s,fname=%s,lname=%s,iscategorized=%s" % \
(id, fname, lname, iscategorized)
cursor.execute('''INSERT into tblcopy (Id, Fname, Lname, Service_number) values(%s, %s, %s, %s)''',(id, fname, lname, "service1"))
sql1 = "UPDATE tbltester SET iscategorized = 1 WHERE Id = '%s'" % id
cursor.execute(sql1)
db.commit()
db.close()
现在,随着我的数据库动态地变得越来越大,我正在使用多台机器来运行我的 python 服务。 python 服务使用 supervisor 一起运行。如果我使用上述代码运行 10 个服务,在 tblcopy 中将创建大约 5 个不同的条目,因为 5 个 python 服务一次获得相同的 ID。有什么SQL方法可以解决我的问题吗?我们可以使用存储过程来做到这一点吗?
提前感谢您的帮助。
最佳答案
并行化此操作没有意义,因为它受 I/O 限制:全部 SELECT
的和INSERT
需要经历同样的瓶颈,即数据库引擎和硬盘。这种方法实际上会更慢,因为您现在引入了并发问题。
像这样重写你的(单线程)进程:
START TRANSACTION;
SELECT id FROM tbltester WHERE iscategorized = 0 FOR UPDATE;
INSERT into tblcopy
SELECT id, fname, lname, "service1"
FROM tbltester WHERE iscategorized = 0;
UPDATE tbltester SET iscategorized = 1 WHERE iscategorized = 0;
COMMIT;
如果在您的初始 SELECT
之间有一些重要的(持久的)处理,情况就会不同。和你最后的 UPDATE
.
由于其他几个原因,此代码效率低下:
- 每次迭代都不必要地打开和关闭与 MySQL 的连接(相反,打开和关闭循环外的连接)
- 一次只处理一条记录(相反,一次处理尽可能多的记录)
- 事务在每次迭代时启动并提交(相反,偶尔提交可能是可以接受的,比如每 10 次迭代)
此外,看起来有一个无限的 while
环形。如果你想让一个“服务”不断地在表之间复制数据,你可能想在你的循环中添加一个短暂的延迟,以避免在没有什么要处理的情况下不断地访问你的数据库。或者,可能更可取的是,您可能需要查看 triggers .
关于python - 如何使用不同的 python 服务将数据库从 MySQL 复制到另一个数据库,确保一行只复制一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20779735/