python - 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)
解决方案
问题原来是因为我使用的是 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"))
推荐阅读
- linux - 设备树,更改固定链接以太网物理速度运行时
- javascript - 显示/隐藏幻灯片的标题仅适用于第一张幻灯片
- wifi - 解码 sendGrid 发送的电子邮件中的编码 URL 时不安全的 WiFi 安全性
- python - 检查用户是否有角色
- r - 克服小标题错误:错误:小标题中的所有列都必须是向量。x 列 `solar.time` 为 NULL
- java - 返回数组“arr”中唯一数值的数量
- python - FastAPI - 模块“app.routers.test”没有属性“路由”
- c - libuv 简单发送 udp
- python - Python tbselenium 显示未定义
- django - 如何让 Django 使用 openid connect 在 Keycloak 中尝试多个领域?