Python Pyramid框架中数据播种前如何删除所有数据库表现有行?
实现方案
方案1:遍历所有模型清空表数据(推荐)
该方案仅清空所有表内现有数据,不会修改表结构,不会影响alembic迁移记录,适配你的需求。
修改后的setup_models代码如下:
# 顶部先导入依赖,将导入路径替换为你项目对应实际路径 from 你的项目名.models import Base def setup_models(dbsession): """ Add or update models / fixtures in the database. """ # 临时禁用SQLite外键约束,避免关联表删除时报错 dbsession.execute("PRAGMA foreign_keys = OFF") # 遍历所有继承自Base的模型类,批量删除表内全部数据 for mapper in Base.registry.mappers: model_class = mapper.class_ dbsession.query(model_class).delete() # 恢复外键约束 dbsession.execute("PRAGMA foreign_keys = ON") dbsession.flush() # 以下为原有播种逻辑 model = models.mymodel.MyModel(name='one', value=1) dbsession.add(model)
注意:如果不需要清空所有表,仅要清空指定表,可替换遍历逻辑为指定模型的删除操作:
# 仅清空MyModel表数据 dbsession.query(models.mymodel.MyModel).delete() # 其他需要清空的模型依次添加对应删除代码即可
方案2:删表重建(适合开发环境快速重置)
如果是本地开发场景,不需要保留迁移记录,可直接删除所有表再重建,执行效率更高:
# 顶部先导入依赖,将导入路径替换为你项目对应实际路径 from 你的项目名.models import Base from 你的项目名.models.meta import engine def setup_models(dbsession): """ Add or update models / fixtures in the database. """ # 删除所有表后重建 Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) # 以下为原有播种逻辑 model = models.mymodel.MyModel(name='one', value=1) dbsession.add(model)
修改完成后重跑venv/bin/initialize_suppah_db development.ini即可实现清空旧数据后插入新的种子数据,不会再出现重复报错问题。
内容的提问来源于stack exchange,提问作者spacether
相关产品推荐
相关产品推荐

