2017-08-27 10 views
0

読み取り専用のリモートデータベースがあります。挿入された新しい行があるかどうかを確認してから、ローをローカルDBに挿入する必要があります。 dbをクエリして時間をかけてフィルタリングするソリューションは1つのみ表示されます。リモートデータベースからのトラック行の挿入

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) 

これを行うにはもっとエレガントな方法がありますか?

答えて

0

このタスクを解決するために複数のオプションがあります。私は2つの名前を付けます。

第1のものは「プル」スタイル、第2のものは「プッシュ」スタイルと見なすことができます。 (リモートDBへのアクセスが制限されている場合は、おそらく2番目のオプションは実際のオプションではない可能性があります。)1)postgres_fdw拡張子を使用し、リモートテーブルでローカルに作業してください。トリガーのある通常のテーブルでは変更を追跡することはできませんが、そのようなテーブルをクエリでき、多くの場合、それらを使って効率的に作業します(たとえば、select count(*) - 1ヶ月程度でリリースされる10で改善されています)。 FDW表の上にマテリアライズド・ビューを作成し、必要な索引を付けてパフォーマンスを向上させることもできます。

このオプションを選択すると、非常に便利なIMPORT FOREIGN SCHEMAステートメントが見つかるでしょう。それはと非常によく、はメンテナンスを簡略化します。

2)論理複製を使用すると、リモート側の各データ変更時に真のシグナルを受け取ることができ、何を処理するかを選択できます。 2ndQuadrantで "pglogical"拡張をチェックしてください。

この方法は、おそらく最も強力で柔軟性があり、最近複雑な統合が行われることになっています。

P. S.申し訳ありませんリンク - スマートフォンで入力してください。

関連する問題