首页 > 解决方案 > SQLAlchemy drop_all 不删除表

问题描述

我正在尝试使用 SQLAlchemy 自动化我的应用程序的数据库创建/删除。我已经创建了模型,并且通过 ORM 查询工作没有问题。但是,当我想从头开始擦除和重新创建数据库时,Base.metadata.drop_all(engine) 会运行,但当我尝试通过 Python 控制台进行故障排除时不会返回任何内容。它实际上也不会删除我的数据存储中的任何对象。我还验证了用户帐户确实具有 DROP 权限。

当我运行 Base.metadata.sorted_tables 时,我确实得到了与模型匹配的表列表。我还尝试在 sorted_tables 上运行 for 循环并对每个表执行删除操作,但出现错误,指出该表不存在。

我的完整代码仓库可以在以下位置找到:https ://github.com/OpenDataAlex/process_tracker_python/tree/master/process_tracker 模型位于模型/目录中,而引擎创建代码位于 data_store.py 中。

我已经复制了我认为相关的部分,但是经过数小时阅读文档并尝试解决这个问题后,一切都变得模糊了 xx

# The engine creation code
engine = create_engine(data_store_type + '://' + data_store_username + ':' + data_store_password
                                           + '@' + data_store_host + '/' + data_store_name)


session = sessionmaker(bind=engine)

session = session(expire_on_commit=False)
session.execute("SET search_path TO %s" % data_store_name)
# The drop code, from data_store.py DataStore().initialize_data_store()
self.logger.warn('ALERT - DATA STORE TO BE OVERWRITTEN - ALL DATA WILL BE LOST')

Base.metadata.drop_all(self.engine)

标签: pythonsqlalchemy

解决方案


问题原来是因为我使用的是 postgresql,所以默认使用公共模式,因为我没有在表模型中定义模式。完成后,架构也被添加到任何 ForeignKey 列 drop_all 和 create_all 就像记录的那样工作。

例如,以下是最终的工作:

class MyTable(Base):
    __tablename__ = "my_table"
    __table_args__ = {"schema": "my_schema"}

    my_table_fk = Column(Integer, ForeignKey("my_schema.my_other_table.my_other_table_id"))

推荐阅读