跟踪从远程数据库插入的行

时间:2017-08-27 18:46:40

标签: postgresql flask sqlalchemy flask-sqlalchemy

拥有只读远程数据库。需要检查其中的新插入行,然后将行插入本地数据库。现在只看到一个查询db并按时间过滤的解决方案:

local_engine, remote_engine = create_engine('db_url'), create_engine('db_url')
Local_Session, Remote_Session = sessionmaker(bind=local_engine), sessionmaker(bind=remote_engine)
local_session, remote_session = Local_Session(), Remote_Session()

Base = declarative_base()
Base.metadata.reflect(local_engine)

class Model(Base):
    __table__ = Base_class.metadata.tables['table']

while True:
    lastest_date = local_session.query(Model).order_by(desc(Model.datefield)).first().datefield
    new_rows = remote_session.query(Model).filter(Model.datefield > lastest_date).all()
    #####
    time.sleep(60)

有没有更优雅的方法(跟踪新行)?

1 个答案:

答案 0 :(得分:0)

您可以使用多种选项来解决此任务。我将两个人命名。

第一个可以被视为" pull"风格,第二个 - 作为"推"。 (因此,如果您对远程数据库的访问权限有限,则第二个可能不是一个真正的选择。)

1)使用postgres_fdw扩展并在本地使用远程表。虽然您无法跟踪像您一样使用带触发器的常规表进行更改,但您可以查询此类表格,并且在许多情况下可以非常有效地使用它们(有些事情 - 例如{{1} - 在9.6中很慢,在10中有所改进,将在一个月左右发布。您还可以在FDW表之上创建物化视图,并使用所需的索引来实现更好的性能。

如果您选择此选项,您可能会发现非常有用的select count(*)语句,显着简化了维护。

2)使用逻辑复制 - 通过它,您可以在远程端的每个数据更改上接收真实信号,您可以选择要采取的措施以及如何处理。查看" pglogical"由2ndQuadrant扩展。

这种方式可能是最强大和最灵活的,而且这些日子应该是多么复杂的集成。

P上。对不起没有链接 - 在智能手机上输入。