2011-11-21 3 views
2

MySQL 데이터베이스에서 pymysql으로 코드 기반을 전환하려고 시도하고 있습니다. 다음과 같은 문제가 발생했습니다. 누군가 비슷한 것을 본 적이 있는지 궁금합니다.pymysql callproc()이 후속 선택에 영향을 미치는 것으로 나타납니다

간단히 말해서 pymysql 커서 callproc() 메서드를 통해 저장 프로 시저를 호출하면 동일한 또는 다른 커서를 사용하는 execute() 메서드를 통해 후속 '선택'호출이 잘못된 결과를 반환합니다. 파이썬 2.7.2와 파이썬 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 문이 제대로 작동합니다.

+0

select 문에서 테이블의 이름을 변경하면 예외가 생성되지 않으므로 데이터베이스 서버에도이 요청이없는 것처럼 보입니다. 연결을 완전히 닫은 후 다시 열면 모든 것이 잘 작동하지만 가능한 경우이를 피하고 싶습니다. –

답변

0

(커밋 된) INSERT 문이 데이터베이스에 나타나지 않는 비슷한 문제가 있습니다. 파이썬 3.2 및 MySQL 커뮤니티 서버 5.5.19 용 PyMySQL 0.5.

가 나를 위해 솔루션을 발견 대신 실행() 메소드를 사용하는, I는 상기 executemany 방법을 사용한 실시 예에 대한 링크도있다 http://code.google.com/p/pymssql/wiki/PymssqlModuleReference 에 모듈을 참조하여 설명한다.

업데이트 잠시 후 오늘은 아직 전체 솔루션이 아니라는 사실을 알게되었습니다. python 스크립트의 끝에 너무 빠른 exit()가 발생하면 데이터가 데이터베이스에서 손실됩니다. 그래서 연결을 끊기 전에 exit()를하기 전에 time.sleep()을 추가하고 마침내 모든 데이터가 나타납니다! 내가 개발자와 추가 논의를위한 포럼/그룹 https://groups.google.com/forum/#!forum/pymysql-users을 제안

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() 

(나는 또한 MyISAM 테이블을 사용하여 전환).

관련 문제