Python pymysql callproc()似乎会影响后续选择

Python pymysql callproc()似乎会影响后续选择,python,mysql,pymysql,Python,Mysql,Pymysql,我正在尝试将代码库从使用MySQLdb转换为pymysql。我遇到了以下问题,不知道是否有人见过类似的情况 简而言之,如果我通过pymysql cursor callproc()方法调用存储过程,则随后使用相同或不同的游标通过execute()方法调用“select”将返回错误的结果。我在Python2.7.2和Python3.2.2中看到了相同的结果 callproc()方法是否以某种方式锁定了服务器?代码如下所示: conn = pymysql.connect(host='localhost

我正在尝试将代码库从使用MySQLdb转换为pymysql。我遇到了以下问题,不知道是否有人见过类似的情况

简而言之,如果我通过pymysql cursor callproc()方法调用存储过程,则随后使用相同或不同的游标通过execute()方法调用“select”将返回错误的结果。我在Python2.7.2和Python3.2.2中看到了相同的结果

callproc()方法是否以某种方式锁定了服务器?代码如下所示:

conn = pymysql.connect(host='localhost', user='me', passwd='pwd',db='mydb')

curr = conn.cursor()

rargs = curr.callproc("getInputVar", (args,))
resultSet = curr.fetchone()
print("Result set   : {0}".format(resultSet))

# curr.close()
#
# curr = conn.cursor()

curr.execute('select * from my_table')
resultSet = curr.fetchall()
print("Result set len : {0}".format(len(resultSet)))        

curr.close()
conn.close()

我可以取消注释上面的close()和游标创建调用,但这不会改变结果。如果我注释掉callproc()调用,select语句就可以正常工作

数据库中没有出现(提交的)INSERT语句,我也有类似的问题。PyMySQL 0.5für Python 3.2和MySQL社区服务器5.5.19

我找到了解决方案:我没有使用execute()方法,而是使用了executemany方法,如上的模块参考中所述 还有一个指向示例的链接

更新 过了一会儿,今天,我发现这还不是完整的解决方案。 python脚本末尾的exit()过快会导致数据库中的数据丢失。 因此,我在关闭连接和退出脚本之前添加了time.sleep(),最后所有数据都出现了! (我也切换到使用myisam表)


我建议论坛/小组与开发人员进行进一步讨论。

如果我在select语句中更改了表的名称,则不会生成异常,因此该请求似乎不会到达数据库服务器。如果我完全关闭连接并重新打开,一切正常,但如果可能的话,我希望避免这种情况。
import pymysql
conn = pymysql.connect(host='localhost', user='root', passwd='', db='mydb', charset='utf8')
conn.autocommit(True)
cur = conn.cursor()

# CREATE tables (SQL statements generated by MySQL workbench, and exported with Menu -> Database -> Forward Engineer)
cur.execute("""
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

DROP SCHEMA IF EXISTS `mydb` ;
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;
# […]

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

""")

# Fill lookup tables:

cur.executemany("insert into mydb.number(tagname,name,shortform) values (%s, %s, %s)", [('ЕД','singular','sg'), ('МН','plural','p')] )
cur.executemany("insert into mydb.person(tagname,name,shortform) values (%s, %s, %s)", [('1-Л','first','1st'), ('2-Л','second','2nd'), ('3-Л','third','3rd')] )
cur.executemany("insert into mydb.pos(tagname,name,shortform) values (%s, %s, %s)", [('S','noun','s'), ('A','adjective','a'), ('ADV','adverb','adv'), ('NUM','numeral','num'), ('PR','preposition','pr'), ('COM','composite','com'), ('CONJ','conjunction','conj'), ('PART','particle','part'), ('P','word-clause','p'), ('INTJ','interjection','intj'), ('NID','foreign-named-entity','nid'), ('V','verb','v')] )
#[…]

import time
time.sleep(3)
cur.close()
conn.close()
time.sleep(3)
exit()