推荐学习书目
› 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 · Jul 29, 2021 · 4629 views
    This topic created in 1922 days ago, the information mentioned may be changed or developed.

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

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

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

    import pymysql; pymysql.install_as_MySQLdb()
    superbai
    superbai
    OP
    Aug 4, 2021
    27
    @frostming #26 感谢,又学到了一个知识点;不过我是虚拟环境的话,这样做是不是只能对当前的虚拟环境生效?因为 site-packages 是跟着虚拟环境走的吧
    superbai
    superbai
    OP
    Aug 4, 2021
    28
    @julyclyde #24 是指 django 的 settings 么?我没有用 django
    superbai
    superbai
    OP
    Aug 4, 2021
    29
    @Trim21 #25 我是想一次改动,对所有人的环境都生效😂
    frostming
    frostming
    Aug 5, 2021❤️1
    30
    @superbai 是的,根据你的需求(项目中用不了 mysqlclient ),每个虚拟环境中按需修改已经足够了
    strict
    strict
    Aug 13, 2021
    31
    monkey patch
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5726 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 02:25 · PVG 10:25 · LAX 18:25 · JFK 21:25
    ♥ Do have faith in what you're doing.