执行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替代被移除的函数:
- 打开目标文件:
vi /usr/local/python3/lib/python3.7/site-packages/pymysqlreplication/row_event.py - 找到第9行的
from pymysql.charset import charset_to_encoding,将其注释或删除。 - 在该位置下方添加以下代码,实现一个功能等价的替代函数:
def charset_to_encoding(charset): from pymysql.charset import Charset return Charset.get_charset(charset).encoding - 保存文件后,重新执行
clickhouse-mysql命令即可。
内容的提问来源于stack exchange,提问作者zhituanchen
相关产品推荐
相关产品推荐

