执行flask db upgrade提示‘Table already exists’错误求助
问题
使用SQLAlchemy创建数据库表后,初始运行正常,但执行flask db upgrade尝试添加新列或更新表时,报错提示表new_users已存在,命令试图重新创建表而非更新。
模型代码:
from app import db from werkzeug.security import generate_password_hash, check_password_hash class register_users(db.Model): __tablename__='new_user' id=db.Column(db.Integer,primary_key=True, autoincrement=True) name=db.Column(db.String(120), nullable=False) email=db.Column(db.String(100), nullable=False) date_of_birth=db.Column(db.DateTime(100), nullable=False) hash_password=db.Column(db.String(1000), nullable=False) @property def password(self): raise AttributeError('password is not a readable attribute') @password.setter def password(self, password): self.hash_password=generate_password_hash(password) def verify_password(self, password): return check_password_hash(self.hash_password,password) def __repr__(self): return '<name %r>'% self.name
错误信息:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1050, "Table 'new_users' already exists") [SQL: CREATE TABLE `New_users` ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(120) NOT NULL, email VARCHAR(100) NOT NULL, date_of_birth DATETIME NOT NULL, hash_password VARCHAR(1000) NOT NULL, PRIMARY KEY (id), UNIQUE (email) )
解决方法
1. 修正表名一致性
错误里的目标表是new_users(带s),但模型中__tablename__设的是new_user(不带s),同时数据库可能开启了大小写敏感(比如MySQL的lower_case_table_names配置),导致识别为不同表。
- 登录数据库执行
SHOW TABLES;查看实际存在的表名 - 将模型中的
__tablename__修改为与数据库中实际表名完全一致,包括大小写和拼写
2. 修复迁移脚本并重新生成
如果之前的迁移脚本存在错误(比如表名写错):
- 删除
migrations/versions目录下对应错误创建表的迁移文件 - 执行
flask db migrate -m "add new columns and fix table name"生成新的迁移脚本 - 打开生成的脚本,确认里面是
ALTER TABLE语句(用于新增列)而非CREATE TABLE - 执行
flask db upgrade完成更新
3. 同步迁移仓库与数据库状态
如果数据库已存在该表,但迁移仓库没有记录:
- 执行
flask db stamp head将当前数据库标记为已同步到最新迁移版本 - 再次执行
flask db migrate生成针对新增列的迁移脚本 - 执行
flask db upgrade应用更新
4. 检查模型变更的正确性
错误中的SQL语句里email列带有UNIQUE约束,但你的模型中并没有设置unique=True,说明迁移脚本可能基于旧模型生成:
- 确认当前模型是最新版本,新增列的定义无误
- 重新生成迁移脚本前,重启Flask服务清除旧模型缓存
内容的提问来源于stack exchange,提问作者Martins. Adesua
相关产品推荐
相关产品推荐

