<p>造成这种情况的主要原因是在进行新查询之前没有从光标获取结果。可能有多个结果集。</p>
<p>要停止错误,必须确保每次使用.nextset时都使用结果集。如果它产生多个结果集-你甚至可能需要做其中的一些。</p>
<pre><code>cursor.callproc('my_mysql_procedure', [some_id,])
result = cursor.fetchall()
for r in result:
do something
cursor.nextset()
cursor.execute("select * from some_table")
result = cursor.fetchall()
</code></pre>
<p>在我的例子中,我发现这实际上是sql查询中其他问题的一个指示器,这些问题在进行后续查询之前不会被选为python错误。他们产生了多个结果集。</p>
<p>把这个应用到下面的例子中(我看到了同样的错误)</p>
<pre><code>>>> import MySQLdb
>>> conn = MySQLdb.connect(passwd="root", db="test")
>>> cur = conn.cursor()
>>> cur.execute("insert into foo values (1););")
1L
>>> cur.nextset()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 107, in nextset
nr = db.next_result()
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
</code></pre>
<p>这里-因为一个解析错误(一些受信任的输入数据,被代码屏蔽)导致分号,然后是一个新语句-这产生了多个结果集。对于这个语句,它不会产生错误,但是对于下一个试图在游标上运行命令的语句,它会产生错误。</p>
<p>我制作了一个github repo-<a href="https://github.com/odmsolutions/mysql_python_out_of_sync_demo" rel="noreferrer">https://github.com/odmsolutions/mysql_python_out_of_sync_demo</a>-来演示和测试这个。</p>
<hr/>
<p>原始答案:
请查看<a href="https://github.com/farcepest/MySQLdb1/issues/28" rel="noreferrer">https://github.com/farcepest/MySQLdb1/issues/28</a>以获取有关如何使用3行代码可靠地重现此内容的详细信息:</p>
<p>再现这一点的最小情况:
(假设您有一个空数据库,并且只创建了一个到该数据库的连接,称为conn)</p>
<pre><code>>>> conn.query("Create table foo(bar int(11))")
>>> conn.query("insert into foo values (1););")
>>> conn.query("insert into foo values (2););")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")
</code></pre>
<p>这是生成的错误语法,从错误中我看不出是这个问题。</p>
<p>尝试按照Bukzor的建议检查最后一个查询或过程-并尝试在原始mysql客户机中运行它以查看真正的问题。</p>