我正在设计一个数据库,在其上面有一个API层来从表中获取数据。这个数据库是postgres。每天晚上,我们都会进行批量ETL过程来更新数据库中的数据。由于一些值得一提的复杂问题,ETL过程涉及消除所有数据并从头开始重建。
显然,这对API来说是有问题的,因为如果API在重建阶段查询数据库,数据将会丢失。
我决定使用两种模式来解决这个问题。 "完成"架构(让我们称之为架构A)和"重建" schema(让我们调用这个模式B)。我的ETL过程如下所示:
1. Create schema B as an exact replica of schema A
2. Completely rebuild the data in schema B
3. In a transaction, drop schema A and rename schema B to schema A
我目前遇到的问题是我使用sqlalchemy Session和Table对象,并且这些表由于其元数据而被绑定到架构A.
我希望能够session.add(obj)
并将其添加到架构B.毕竟,架构A和架构B完全相同,因此表定义对两者都有效。
我想知道是否有人建议我如何使用sqlalchemy的会话对象和/或表对象动态地选择我应该使用的模式。
我仍然希望会话/表指向架构A,因为相同的代码在API层中重用。我只想在这一步中使用模式B.
答案 0 :(得分:0)
我最后通过将表定义包装在接受sqlalchemy元数据对象的函数中并返回绑定到该元数据对象的表定义来解决此问题。