2011-11-21 33 views
2

我試圖從使用MySQLdb到pymysql的代碼庫轉換。我遇到以下問題,並想知道是否有人看到類似的東西。pymysql callproc()似乎影響隨後的選擇

簡而言之,如果通過pymysql遊標的callproc()方法調用存儲過程,則使用相同或不同遊標的execute()方法的後續「select」調用將返回不正確的結果。我看到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() 

我可以取消的密切()和光標創造上述要求,但是這並不能改變結果。如果我註釋掉callproc()調用,select語句就可以正常工作。

+0

如果我在select語句中更改表的名稱,則不會生成任何異常,所以它似乎不會將此請求連接到數據庫服務器。如果我完全關閉連接並重新打開它,一切正常,但如果可能的話,我想避免這種情況。 –

回答

0

我有一個類似的問題(提交)INSERT語句沒有出現在數據庫中。 PyMySQL 0.5 for Python 3.2和MySQL社區服務器5.5.19。

我發現我的解決方案:代替使用execute()方法中,我使用的executemany方法中,在模塊參考解釋上 http://code.google.com/p/pymssql/wiki/PymssqlModuleReference 還有以實施例的鏈接。

更新 稍後,今天,我發現這還不是完整的解決方案。 python腳本結尾處太快的exit()會導致數據在數據庫中丟失。 因此,我在關閉連接之前和exit()腳本之前添加了一個time.sleep(),最後出現了所有數據! (I也切換到使用一個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 @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_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