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 · 3211 次点击
    这是一个创建于 1215 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:项目中用到了 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]: import 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   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:07 · PVG 06:07 · LAX 14:07 · JFK 17:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.