python3 项目不改代码前提下,有什么办法可以把引用的 mysqlclient 直接替换为 PyMySQL? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
superbai
V2EX    Python

python3 项目不改代码前提下,有什么办法可以把引用的 mysqlclient 直接替换为 PyMySQL?

  •  
  •   superbai 2021-07-29 12:31:34 +08:00 3717 次点击
    这是一个创建于 1538 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:项目中用到了 mysqlclient,但是这几天换了 m1 mac,mysqlclient 用不了了,上网搜了下感觉现在继续用 mysqlclient 的解决方案都不太完美,就考虑换成 PyMySQL

    问题:如果不改代码的话,有什么方法可以把 mysqlclient 直接替换成 PyMySQL 吗?感觉应该有能实现的方法,但是搜了一圈也没搜到,不知道是关键词不对还是没有办法

    31 条回复    2021-08-13 15:27:53 +08:00
    Vegetable
        1
    Vegetable  
       2021-07-29 13:02:17 +08:00   1
    完全不改代码应该不太行
    至少也要
    pymysql.install_as_MySQLdb()
    superbai
        2
    superbai  
    OP
       2021-07-29 13:22:12 +08:00
    @Vegetable #1 感谢回复。看了下这个方法,应该不是我想要的。我想要的是,就把 pymysql 重命名成 mysqldb,这样子代码就不用改了。因为 pymysql 和 mysqldb 看起来 API 几乎是完全相同的
    Vegetable
        3
    Vegetable  
       2021-07-29 13:25:41 +08:00
    @superbai pymysql.install_as_MySQLdb()之后,代码其他地方 import mysqldb 就等于 import pymysql 。并且接口是兼容的。
    $ python manage.py shell
    ...
    In [1]: impot MySQLdb

    In [2]: MySQLdb
    Out[2]: <module 'pymysql' from '/.../site-packages/pymysql/__init__.py'>
    Trim21
        4
    Trim21  
       2021-07-29 13:40:47 +08:00
    @superbai #2 这句话就是这个作用,只需要在程序的入口加这么一句话,其他的 mysqldb 都不用改
    HankLu
        5
    HankLu  
       2021-07-29 13:50:17 +08:00
    还有这种操作?学习了
    wellsc
        6
    wellsc  
       2021-07-29 13:56:58 +08:00
    @Vegetable 函数接口不一致会出现问题吧
    Vegetable
        7
    Vegetable  
       2021-07-29 14:16:55 +08:00
    @wellsc 我没研究过,因为用这个最常见的场景是在 django 项目替换 mysqldb,都是无脑替换的,接口应该是完全兼容的。平时都是用 orm,connecter 的 api 没关注过
    fiht
        8
    fiht  
       2021-07-29 14:44:36 +08:00
    人生苦短,还是不要用 m1 折腾了,楼主快及时止损。
    改好 pymysql 之后下一个库还有兼容性问题呢,继续改么?
    Trim21
        9
    Trim21  
       2021-07-29 15:04:24 +08:00 via Android   1
    @wellsc python 有几个 pep 规定了 dbapi 的接口,大部分数据库的 driver 函数接口都是按照这个来的。
    ChrisFreeMan
        10
    ChrisFreeMan  
       2021-07-29 15:23:25 +08:00
    我都不知道是 MacOS 的兼容性差还是 Python 生态的兼容性差,我也是 M1 Mac,那个 Pygame 死活装不上去,各种依赖都装了,折腾两天最后还是跑不起来。
    felixcode
        11
    felixcode  
       2021-07-29 15:43:52 +08:00
    有些库 x86 都够折腾了,m1 下面更难了。
    ericguo
        12
    ericguo  
       2021-07-29 15:48:30 +08:00
    考虑一下 ruby 吧,虽然 Python 的 MOTO 说,there is one and only one way to do things,但是实际上库是一大堆,质量参差不齐,Ruby 虽然允许 many way to do one things,但是真的入手你会发现其实往往选择只有一种,好的写法只有一种。
    aladdinding
        13
    aladdinding  
       2021-07-29 16:07:41 +08:00
    @ericguo 别个项目就是 python 你让别个重写吗
    ericguo
        14
    ericguo  
       2021-07-29 16:31:00 +08:00
    @aladdinding 我也就看上面一堆人都说 python 折腾,感叹一下。。。
    ruanimal
        15
    ruanimal  
       2021-07-29 17:12:46 +08:00
    @ericguo 没人用的语言自然没人说折腾
    linhongye
        16
    linhongye  
       2021-07-29 17:15:48 +08:00
    这个做法太扯了...
    数据库操作的代码, 应该没几个文件会涉及, 直接全部改掉也不会太累.
    如果你每个地方, 都是直接去操做数据库的话, 这也是个合适的时间、借口, 重构代码...
    ericguo
        17
    ericguo  
       2021-07-29 20:19:02 +08:00
    @ruanimal Python 初学者的第一门语言,没法比,单 Rails 也不是没人用。https://trends.builtwith.com/framework
    yaxe
        18
    yaxe  
       2021-07-30 09:33:25 +08:00   1
    抖个机灵
    import mysqlclient as PyMySQL
    superbai
        19
    superbai  
    OP
       2021-07-30 16:39:03 +08:00
    @Vegetable #3
    @Trim21 #4 抱歉有其他事情耽误了,现在才回复。因为是引用的包里面用到了 MySQLdb,所以我没有办法直接改对应的文件添加这句话。请问有方法可以在自己的文件里加上这句话,然后对引用的包生效吗?
    superbai
        20
    superbai  
    OP
       2021-07-30 16:41:00 +08:00
    @HankLu #5
    @ChrisFreeMan #10
    毕竟底层架构都不一样了,我感觉有调用在其它平台上编译产物的代码,理论上都有可能会有问题.....
    superbai
        21
    superbai  
    OP
       2021-07-30 16:43:56 +08:00
    @fiht #8 有一说一,除了这些兼容性问题,其它的还是挺不错的,尤其是电池续航比 intel CPU 的 MacBook pro 要好很多,电脑也终于不烫手了
    Vegetable
        22
    Vegetable  
       2021-07-30 16:45:13 +08:00
    @superbai 保证这句话再 import mysqldb 之前执行就可以。引入依赖包之前,比如启动时是 python entry.py ,那就 entry.py 的最上边添加这个。
    superbai
        23
    superbai  
    OP
       2021-07-30 16:50:27 +08:00
    @Vegetable #22 我都是零散的脚本,没有统一入口
    julyclyde
        24
    julyclyde  
       2021-07-30 18:08:25 +08:00
    @superbai 写到 settings 里
    Trim21
        25
    Trim21  
       2021-07-31 00:45:58 +08:00
    @superbai #23 那你手动写个叫 mysqldb 的包安装到虚拟环境里,然后从 pymysql 里面 import *吧...
    frostming
        26
    frostming  
       2021-08-02 17:58:34 +08:00   1
    @superbai 接 25L, 大可不必如此麻烦,只用放一个 _patch_mysql.pth 到 site-packages 下面,内容是

    import pymysql; pymysql.install_as_MySQLdb()
    superbai
        27
    superbai  
    OP
       2021-08-04 22:53:16 +08:00
    @frostming #26 感谢,又学到了一个知识点;不过我是虚拟环境的话,这样做是不是只能对当前的虚拟环境生效?因为 site-packages 是跟着虚拟环境走的吧
    superbai
        28
    superbai  
    OP
       2021-08-04 22:53:41 +08:00
    @julyclyde #24 是指 django 的 settings 么?我没有用 django
    superbai
        29
    superbai  
    OP
       2021-08-04 22:54:06 +08:00
    @Trim21 #25 我是想一次改动,对所有人的环境都生效
    frostming
        30
    frostming  
       2021-08-05 09:00:57 +08:00   1
    @superbai 是的,根据你的需求(项目中用不了 mysqlclient ),每个虚拟环境中按需修改已经足够了
    strict
        31
    strict  
       2021-08-13 15:27:53 +08:00
    monkey patch
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5592 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 08:10 PVG 16:10 LAX 01:10 JFK 04:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86