3

コードベースをMySQLdbの使用からpymysqlに移行しようとしています。私は次の問題に直面していて、誰かが似たようなものを見たことがないかと思います。

簡単に言うと、pymysqlカーソル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ステートメントは問題なく機能します。

4

1 に答える 1

0

(コミットされた) INSERT ステートメントがデータベースに表示されないという同様の問題があります。PyMySQL 0.5 for Python 3.2 および MySQL Community Server 5.5.19。

私は解決策を見つけました:execute()メソッドを使用する代わりに、http://code.google.com/p/pymssql/wiki/PymssqlModuleReferenceのモジュールリファレンスで説明されているexecutemanyメソッドを使用しまし リンクもあります例に。

更新 少し後、今日、これがまだ完全な解決策ではないことがわかりました。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をお勧めします。

于 2012-01-16T10:36:51.220 に答える