pymysql callproc() 似乎会影响后续选择
Posted
技术标签:
【中文标题】pymysql callproc() 似乎会影响后续选择【英文标题】:pymysql callproc() appears to affect subsequent selects 【发布时间】:2012-01-03 08:50:45 【问题描述】:我正在尝试将代码库从使用 mysqldb 转换为 pymysql。我遇到以下问题,想知道是否有人见过类似的东西。
简而言之,如果我通过 pymysql 游标 callproc() 方法调用存储过程,则通过使用相同或不同游标的 execute() 方法进行的后续“选择”调用会返回不正确的结果。我看到 Python 2.7.2 和 Python 3.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 语句可以正常工作。
【问题讨论】:
如果我在 select 语句中更改表的名称,则不会生成异常,因此该请求似乎甚至没有到达数据库服务器。如果我完全关闭连接并重新打开它,一切正常,但如果可能的话,我想避免这种情况。 【参考方案1】:我有一个类似的问题,即(提交的)INSERT 语句没有出现在数据库中。 PyMySQL 0.5 für Python 3.2 和 MySQL Community Server 5.5.19。
我为我找到了解决方案:我没有使用 execute() 方法,而是使用了 executemany 方法,在模块参考中解释 http://code.google.com/p/pymssql/wiki/PymssqlModuleReference 还有一个示例链接。
更新 稍后,今天,我发现这还不是完整的解决方案。 python 脚本末尾太快的 exit() 会使数据在数据库中丢失。 所以,我在关闭连接之前和exit()脚本之前添加了一个time.sleep(),最后所有的数据都出现了! (我也改用 myisam 表)
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()
我建议论坛/群组https://groups.google.com/forum/#!forum/pymysql-users 与开发者进一步讨论。
【讨论】:
以上是关于pymysql callproc() 似乎会影响后续选择的主要内容,如果未能解决你的问题,请参考以下文章
什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?
使用 callproc 从 django 调用 PL/SQL 过程
在 pymssql 中使用 `query` 和 `callproc` 调用存储过程的区别