DRF迁移报错sqlite3.OperationalError:new__budgets_budget列数过多求助
解决SQLite迁移时"too many columns"错误的方案
核心原因
SQLite单表默认最大列数为2000,Django执行迁移时会创建临时表(比如new__budgets_budget)处理结构变更,一旦临时表列数超过这个限制就会触发sqlite3.OperationalError: too many columns错误。你拆分表后仍报错,大概率是旧迁移残留或迁移逻辑未正确拆分导致的。
具体解决办法
清理残留的旧迁移文件
检查项目中budgets应用的migrations目录,除__init__.py外,删除所有涉及原Budget表新增列、合并表结构的旧迁移文件(先做好备份)。之后执行:python manage.py makemigrations python manage.py migrate若数据库已存在拆分后的表结构,用
python manage.py migrate --fake标记迁移完成,避免重复操作。拆分迁移操作,分步执行
不要一次性生成所有拆分表的迁移,分步骤完成:- 先只定义Budget1模型,执行
makemigrations和migrate完成该表创建; - 再添加Budget2模型,重复迁移步骤;
- 最后添加Budget3模型完成迁移。
每次迁移仅处理单表创建,不会触发临时表列数超限问题。
- 先只定义Budget1模型,执行
手动干预迁移过程
若自动生成的迁移文件仍有问题,可直接用SQLite命令行创建拆分后的三张表,再执行:python manage.py migrate --fake budgets <迁移编号>让Django迁移系统标记这些表已创建,之后就能正常通过模型操作数据。
额外建议
SQLite本身不是为超宽表设计的,即使拆分后单表1000列也接近它的上限。如果后续还有字段扩容需求,建议更换为PostgreSQL或MySQL这类更适配复杂表结构的数据库。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

