原因:
pymysql通过.进行分割,但是Inception的版本信息是这样的
Ver 14.14 Distrib Inception2.1.50, for Linux (x86_64) using EditLine wrapper
正常Mysql的版本号是:
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper
因此Pymysql获取到的版本值为Inception2,所以在内部强制类型转换int()的时候报value error。
解决方法(修改pymysql源码):
修改Pymysql文件夹内的connections.py
def _request_authentication(self):
# https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse
if self.server_version.split('.', 1)[0] == 'Inception2':
self.client_flag |= CLIENT.MULTI_RESULTS
elif int(self.server_version.split('.', 1)[0]) >= 5:
self.client_flag |= CLIENT.MULTI_RESULTS
Inception始终反馈"Must start as begin statement"的语法错误
注意! 这个问题是出现在正确书写了inception的语法格式情况下,
语法规则:
/--user=username;--password=xxxx;--host=127.0.0.1;--port=3306;/
inception_magic_start;
... # 这里写sql语句;
inception_maigc_commit;
如果是语法问题,请先自行检查语法。
原因:
pymysql模块会自动向inception发送SHOW WARNINGS语句,而恰好这个warnings被inception捕捉到了,从而导致inception返回一个"Must start as begin statement"错误被archer捕捉到报在日志里.
解决方法:
请修改pymysql/cursors.py:338行,将self._show_warnings()这一句注释掉,换成pass,如下:
if not self._defer_warnings:
# self._show_warnings()
pass
这个方法有副作用,会导致所有调用该pymysql模块的程序不能show warnings