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

使用aerich做sqlite迁移升级时报tortoise.exceptions.OperationalError列不存在

问题根因

出现这个错误有3种常见原因:

  1. 你使用的SQLite版本低于3.35.0,该版本才首次支持ALTER TABLE DROP COLUMN语法,低版本执行删列语句会直接抛出字段不存在的错误
  2. 你操作前已经手动删除过该字段、或者之前的迁移操作异常导致user表中本就不存在some_column字段,执行删列语句自然报错
  3. 第一次初始化模型同步表结构时,你就已经注释了some_column字段,数据库表从最开始就没有该字段
解决方案
  • 第一步先排查字段是否真实存在
    用SQLite客户端打开你的数据库文件,执行如下语句查看表结构:
    PRAGMA table_info("user");
    
    如果返回结果中没有some_column相关行,说明表中本就没有该字段:直接删除本次生成的迁移文件,重新执行aerich migrate生成与当前模型匹配的迁移文件,再执行aerich upgrade即可。
  • 第二步排查SQLite版本
    执行sqlite3 --version查看版本号:
    • 若版本≥3.35.0:直接执行迁移即可正常运行
    • 若版本<3.35.0且无法升级版本:修改本次生成的迁移文件SQL为SQLite兼容的整表重建逻辑,示例如下:
    -- upgrade --
    CREATE TABLE IF NOT EXISTS "user_new" (
        "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        "username" VARCHAR(50) NOT NULL UNIQUE
    );
    INSERT INTO "user_new" ("id", "username") SELECT "id", "username" FROM "user";
    DROP TABLE "user";
    ALTER TABLE "user_new" RENAME TO "user";
    -- downgrade --
    CREATE TABLE IF NOT EXISTS "user_new" (
        "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        "username" VARCHAR(50) NOT NULL UNIQUE,
        "some_column" VARCHAR(50) NOT NULL
    );
    INSERT INTO "user_new" ("id", "username", "some_column") SELECT "id", "username", '' FROM "user";
    DROP TABLE "user";
    ALTER TABLE "user_new" RENAME TO "user";
    
  • 额外注意事项
    后续新增非空字段时,必须在模型字段中指定default属性,否则迁移时会因为现有行没有对应字段值报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:18:02