SQLAlchemy定义表含hash_time字段 插入时提示列不存在原因排查
问题根源
- 测试数据填充脚本存在低级错误:你创建第二个数据库的会话时,代码写的是
session2 = Session(),误用了绑定第一个数据库upa.db的Session类,而非刚定义的绑定ra.db的Session2类,相当于要插入第二个库的数据实际被发往第一个库执行,第一个库的users表自然没有hash_time相关字段,直接触发报错。 - SQLAlchemy的
Base.metadata.create_all方法默认不会覆盖或修改已存在的表结构,你之前测试时生成过错误结构的ra.db/upa.db文件,如果没有手动删除旧数据库文件,后续修改表名、修改Base类的操作都不会生效,旧的错误表结构会一直保留。 - 两个定义脚本都使用同名的
Base全局变量,在同一个进程内导入时后导入的变量会覆盖先导入的,属于潜在隐患,容易导致后续元数据操作混乱。
修复步骤
- 先删除当前目录下旧的
upa.db,以及路径/Users/rpfhome/Documents/POS II/log in/下旧的ra.db文件,清除历史错误表结构。 - 修正测试填充脚本的会话实例化错误:
把
改为session2 = Session()session2 = Session2() - (推荐)给两个数据库的声明基类重命名避免冲突:
- 将
create_redirectauthdb.py里的Base = declarative_base()改为Base2 = declarative_base(),对应的Redirected_User继承Base2,最后的建表语句改为Base2.metadata.create_all(engine) - 如果两个库的表名都叫users不会影响业务逻辑,可以不用修改表名,只要基类和会话绑定正确就不会冲突。
- 将
内容的提问来源于stack exchange,提问作者DrRaspberry
相关产品推荐
相关产品推荐

