如何使用不同的python服务将数据库从MySQL复制到另一个数据库,确保一行只被复制一次?

2024-10-01 13:25:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为tbltest的数据库,它有4列:Id,Fname,Lname,Iscategorized。我必须将数据从它的前三列复制到另一个数据库tblcopy,它有4列:Id、Fname、Lname、Service_number。我只在Iscategorized为0时复制数据,复制后更新为1。Service列告诉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服务使用管理器一起运行。如果我用上面提到的代码运行10个服务,那么在tblcopy中会创建大约5个不同的条目,因为5个python服务一次获得相同的id。有没有SQL方法可以解决我的问题?我们可以用存储过程来做这个吗?在

提前谢谢你的帮助。在


Tags: 数据id数据库executedbservicefnamecursor
1条回答
网友
1楼 · 发布于 2024-10-01 13:25:01

并行化此操作没有意义,因为它是I/O绑定的:所有SELECT和{}都需要经历相同的瓶颈,即数据库引擎和硬盘。这种方法实际上会比较慢,因为您现在引入了并发问题。在

重写(单线程)过程如下:

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

相关问题 更多 >