我正在尝试使用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 这些模型位于models /目录中,而引擎创建代码位于data_store.py中。
我已经复制了我认为是相关的内容,但是经过数小时的阅读文档并尝试解决此问题,x.x都变得模糊了
# 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)
答案 0 :(得分:1)
原来的问题是,因为我使用的是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"))