You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行clickhouse-mysql遇ImportError:无法从pymysql.charset导入charset_to_encoding

解决PyMySQL导入charset_to_encoding失败的问题

问题重现

执行clickhouse-mysql命令时触发如下错误:

[root@mytestuse pymysql]# clickhouse-mysql
回溯(最近的调用最后):
  文件"/usr/local/bin/clickhouse-mysql",第5行,在<module>中
    from clickhouse_mysql import main
  文件"/usr/local/python3/lib/python3.7/site-packages/clickhouse_mysql/__init__.py",第4行,在<module>中
    from .main import Main
  文件"/usr/local/python3/lib/python3.7/site-packages/clickhouse_mysql/main.py",第21行,在<module>中
    from clickhouse_mysql.config import Config
  文件"/usr/local/python3/lib/python3.7/site-packages/clickhouse_mysql/config.py",第4行,在<module>中
    from clickhouse_mysql.reader.mysqlreader import MySQLReader
  文件"/usr/local/python3/lib/python3.7/site-packages/clickhouse_mysql/reader/mysqlreader.py",第8行,在<module>中
    from pymysqlreplication import BinLogStreamReader
  文件"/usr/local/python3/lib/python3.7/site-packages/pymysqlreplication/__init__.py",第23行,在<module>中
    from .binlogstream import BinLogStreamReader
  文件"/usr/local/python3/lib/python3.7/site-packages/pymysqlreplication/binlogstream.py",第10行,在<module>中
    from .packet import BinLogPacketWrapper
  文件"/usr/local/python3/lib/python3.7/site-packages/pymysqlreplication/packet.py",第7行,在<module>中
    from pymysqlreplication import constants, event, row_event
  文件"/usr/local/python3/lib/python3.7/site-packages/pymysqlreplication/row_event.py",第9行,在<module>中
    from pymysql.charset import charset_to_encoding
ImportError: 无法从'pymysql.charset' (/usr/local/python3/lib/python3.7/site-packages/pymysql/charset.py)导入名称'charset_to_encoding'

环境信息:

  • 系统:CentOS Linux release 7.6
  • Python版本:3.7.8

问题原因

这个错误是因为pymysqlreplication库依赖的charset_to_encoding函数在PyMySQL 1.0.0及以上版本中被移除了,导致两个库的版本不兼容。

解决方案

方案1:降级PyMySQL到兼容版本

最省心的解决方式是安装保留charset_to_encoding函数的旧版PyMySQL,比如0.10.1:

pip install pymysql==0.10.1

安装完成后重新运行clickhouse-mysql即可恢复正常。

方案2:修改pymysqlreplication源码适配新版本PyMySQL

如果不想降级PyMySQL,可以手动修改pymysqlreplication的代码,用新版本的API替代被移除的函数:

  1. 打开目标文件:
    vi /usr/local/python3/lib/python3.7/site-packages/pymysqlreplication/row_event.py
    
  2. 找到第9行的from pymysql.charset import charset_to_encoding,将其注释或删除。
  3. 在该位置下方添加以下代码,实现一个功能等价的替代函数:
    def charset_to_encoding(charset):
        from pymysql.charset import Charset
        return Charset.get_charset(charset).encoding
    
  4. 保存文件后,重新执行clickhouse-mysql命令即可。

内容的提问来源于stack exchange,提问作者zhituanchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:27:55