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

标签 python mysql

我有一个名为 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/

相关文章:

python - 如何将边框图像(常量)粘贴到多个缩略图上?

python - 如何匹配文本节点然后使用 XPath 跟随父节点

python - 如何优化 Python 中大型(75,000 项) bool 值集的操作?

php - MySQL 更改表在已存在的字段之前或之后添加字段

更新多行时MySQL重复条目

mysql - 估计 mysql 中读/写查询的数量

python - 意外的 python 函数返回行为

mysql - NodeJS Sails FrameWork 锁定关键代码

mysql - 在 MySQL 中插入 100 万条记录

python 错误: too many indices for array