【问题标题】:Two connections/cursors in mysqldb - commands out of sync errormysqldb 中的两个连接/游标 - 命令不同步错误
【发布时间】:2013-12-03 23:49:14
【问题描述】:

我在脚本的一部分中使用 mysqldb 将信息从一个数据库复制到另一个数据库。我拥有的代码的 sn-p 如下:

connection1 = mysqldb.connect('localhost', 'root', 'password', 'old_database')
connection2 = mysqldb.connect('localhost', 'root', 'password', 'new_database')
connection2.autocommit(True)

cursor2 = connection2.cursor()
cursor2.execute("CREATE TABLE IF NOT EXISTS...")
//if I put a cursor2.close() or a connection2.commit() here, that throws the error as well

cursor1 = connection1.cursor()
cursor1.execute("SELECT * FROM old_database.data")
sql = "INSERT INTO new_database.data(a, b) VALUES (%s, %s)"
for row in cursor1.fetchall():
    a, b = row
    data = [a, b]
    cursor2.execute(sql, data)
print "done"
connection1.close()
connection2.close()

我不断收到以下异常: 异常_mysql_exceptions.ProgrammingError:(2014,“命令不同步;您现在无法运行此命令”) 每当它到达cursor2.execute(sql, data) 行时。我知道在同一个连接上使用两个游标会出现并发问题,但是如何在两个不同的连接上使用两个游标呢?

更新:也没有多线程在任何地方进行。 在连接上添加显式 commit() 调用或尝试在游标上调用 close() 会导致抛出相同的错误,但与新调用一致...

更新:我在同一个端口上使用两个连接,这会影响什么吗?

【问题讨论】:

  • 尝试在大量数据上使用cursor2.executemany
  • 您能否就如何在这种情况下做到这一点提供一些指导?我需要将 cursor1 中的所有数据提取到某种列表中以传递给 cursor2,对吗?
  • 哦,在我的实际代码中,我有这样的构造,我在循环中修改值,所以我认为我不能在这里使用 execute_many。

标签: python sql cursor database-connection mysql-python


【解决方案1】:

在第一次执行调用后尝试执行connection2.commit()。编辑:以及随后的每一个。

你也可以调用connection2.autocommit(True)让它在每次执行后自动提交。

您可能需要在每次提交后调用cursor2.close(),然后再调用cursor2 = connection2.cursor()

【讨论】:

  • 感谢威利的回复;我试过了,但得到了同样的错误,但这次是在调用 connection2.commit() 时。还有其他想法吗?
  • 查看我的编辑。您需要每次都调用它,或者在任何execute 调用之前使用autocommit(True)
  • 我已经有一段时间没有直接使用 MySQLdb 了。您是否在创建游标之前设置了自动提交?我不记得这是否有影响。此外,我通常总是喜欢回滚东西的能力,所以我大部分时间都是手动提交的。尝试在每次调用 execute 后调用 cursor2.commit(),包括循环中的那个。
  • 尝试关闭并重新打开游标。查看我的一些旧代码,似乎我总是这样做,所以当我遇到这个问题时,这可能就是答案。
  • 您在每次重复executecommit 后都尝试过吗?我在旧代码中看到的重复模式是execute,然后是commit,然后是close,每次调用。这意味着在创建表之后,您将在循环开始时打开一个新游标。然后在循环中执行并关闭它。
【解决方案2】:

创建表后尝试提交 cursor2 提交 cursor2 后打开 cursor1

【讨论】:

  • 提交光标与提交连接的作用相同——同样的错误,但现在在提交行。
  • 在提交 cursor2 时,我仍然遇到同样的错误,即使之后我才打开 cursor1。
猜你喜欢
  • 2013-10-18
  • 1970-01-01
  • 2012-08-09
  • 2013-01-11
  • 2012-11-04
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多