使用aerich做sqlite迁移升级时报tortoise.exceptions.OperationalError列不存在
问题根因
出现这个错误有3种常见原因:
- 你使用的SQLite版本低于3.35.0,该版本才首次支持
ALTER TABLE DROP COLUMN语法,低版本执行删列语句会直接抛出字段不存在的错误 - 你操作前已经手动删除过该字段、或者之前的迁移操作异常导致
user表中本就不存在some_column字段,执行删列语句自然报错 - 第一次初始化模型同步表结构时,你就已经注释了
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
相关产品推荐
相关产品推荐

