无法向imdbpy2sql.py传数据库URL,遇create_engine参数错误
问题描述
运行imdbpy2sql.py或s32cinemagoer.py时触发相同错误:
执行命令:
python3 s32cinemagoer.py /home/username/frozendata 'mysql://imdb:imdb@localhost/imdb'
报错信息:TypeError,提示向create_engine()传入无效参数'encoding'。
已尝试的操作:
- 查阅SQLAlchemy官方文档,确认文档显示
create_engine()支持encoding参数,但问题依旧 - 排查MySQL遗留UTF-8编码问题,怀疑Cinemagoer包的
setConnection()函数存在编码传递异常 - 切换SQLAlchemy 1.3版本,使用PyMySQL适配器解决
No module named 'MySQLdb'错误,但核心问题未解决
环境信息:
- Ubuntu 20.04.6 LTS
- Python 3.8.10
- cinemagoer 2023.5.1
- SQLAlchemy 1.3/2.0
问题分析
核心原因是Cinemagoer(原IMDbPY)的编码参数传递逻辑与SQLAlchemy新版本不兼容:
- SQLAlchemy 1.4及以上版本已移除
create_engine()的encoding参数,改用connect_args字典传递连接级别的编码配置;但Cinemagoer 2023.5.1的setConnection()函数仍在直接传递encoding参数,导致参数无效报错。 - 即使使用SQLAlchemy 1.3,由于MySQL连接适配器(PyMySQL)的参数优先级问题,Cinemagoer主动传递的
encoding参数会与URL中的charset配置冲突,同样触发错误。
解决方案
方案1:修改Cinemagoer源码适配SQLAlchemy
找到Cinemagoer安装目录下的sql/__init__.py文件,定位setConnection方法:
- 将原代码中传递
encoding参数的逻辑替换为connect_args传递charset:
原代码示例:
修改为:engine = create_engine(dburi, encoding=encoding, echo=echo, poolclass=NullPool)
注:engine = create_engine(dburi, connect_args={"charset": "utf8mb4"}, echo=echo, poolclass=NullPool)utf8mb4是MySQL推荐的完整UTF-8编码,替代遗留的utf8
方案2:调整SQLAlchemy版本与连接URL
- 保持SQLAlchemy 1.3版本,将MySQL连接URL修改为包含charset参数:
python3 s32cinemagoer.py /home/username/frozendata 'mysql+pymysql://imdb:imdb@localhost/imdb?charset=utf8mb4' - 同时修改Cinemagoer的
setConnection方法,移除encoding参数的传递,避免参数冲突。
方案3:临时绕过编码参数传递
直接修改s32cinemagoer.py或imdbpy2sql.py的代码,找到调用setConnection的位置,删除传递encoding参数的代码行,让SQLAlchemy自动使用URL中指定的charset配置。
内容的提问来源于stack exchange,提问作者Васисулий Пупкин
相关产品推荐
相关产品推荐

