自动化DDL审核|pymysql链接Inception中踩过的几个坑

简单整理了一下这几天使用pymysql链接inception做sql审核过程中出现的坑和解决方法。

这些解决方法一定不是最漂亮的,如果有伙伴遇到同样的问题,并且有好的解决方案,请一定在留言中回一下我哦。

先行感激!!

Pymysql在链接inception在判断版本时出现value error

原因:

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

这样的方式可以解决问题,但总觉得不妥,没法普及,不然需要带着修改过的Pymysql包 -。-|| )

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捕捉到报在日志里.

解决方法:

很遗憾,目前的方法我依然是修改pymsql的源码,请修改pymysql/cursors.py:338行,将self._show_warnings()这一句注释掉,换成pass,如下:

依旧,这个方法有副作用,会导致所有调用该pymysql模块的程序不能show warnings,

这个问题的解决方法:

推荐使用virtualenv或venv创建一个独立的python运行环境来管理包

执行时,出现Commands out of sync的错误

原因:

这个原因出现在应用层的话,检查在fetch all前面是否有commit,去掉之后,问题就解决了。

不需要手动commit,默认会自动commit

作者Blog地址:www.vimiix.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vimiix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值