Django执行orator migrate命令提示Command Cancelled!报错如何解决
orator migrate直接返回Command Cancelled!是Orator 0.9版本在高版本Python环境下的典型问题,没有抛出具体堆栈是因为CLI做了全局异常捕获,所有触发终止的逻辑都会统一返回这个提示,按以下顺序排查修复即可:
首先修正命令执行参数
Orator CLI不会自动加载项目根目录下的orator.py配置,裸跑命令会直接因为找不到数据库配置终止,必须显式指定配置路径和迁移目录:orator migrate -c ./orator.py -p ./migrations/ -f其中
-f参数是强制跳过确认环节,用来绕过Python3.9的兼容问题:Orator 0.9最后更新于2019年,确认逻辑依赖的distutils.util.strtobool在Python3.9中被标记为废弃、部分环境下调用直接抛错,被全局捕获后就会返回取消提示,加-f可以直接绕开这段有问题的逻辑。
注意迁移目录migrations需要提前手动创建,不要和Django自带的应用迁移目录混用,避免冲突。补全数据库配置项
你当前的MySQL配置缺少必填的端口、字符集参数,连接失败也会触发命令终止,修正后的配置段如下:config = { 'mysql': { 'driver': 'mysql', 'host': 'localhost', 'port': 3306, 'database': env('DB_DATABASE'), 'user': env('DB_USERNAME'), 'password': env('DB_PASSWORD'), 'charset': 'utf8mb4', 'prefix': '' } }提前确认安装了可用的MySQL客户端依赖,推荐在Python3.9环境下安装
pymysql,兼容性比旧版mysqlclient更好。修正迁移文件规范
Orator扫描迁移文件时要求文件名必须带时间戳前缀,格式为[YYYY_MM_DD_HHMMSS]_描述.py,比如2024_05_20_120000_create_products_table.py,如果文件名不符合规则,CLI扫描不到有效迁移任务也会直接终止。你当前的迁移类名CreateProductsable存在拼写错误,虽然不影响执行,建议改成CreateProductsTable方便后续维护。
如果执行完以上步骤还是报错,可以临时修改Orator源码里的全局异常捕获逻辑,打印具体异常堆栈定位问题,路径在虚拟环境的orator/commands/command.py文件中,找到捕获异常打印Command Cancelled!的代码段,加一行traceback.print_exc()就能看到真实报错原因。
内容的提问来源于stack exchange,提问作者Muhammad AbuBaker

