2017-07-13 13 views
0

問題:Postgresデータベースに解析する必要のあるスプレッドシートのセット。挿入は前方に向かっている。しかし、スプレッドシートのデータが変更された場合はどうなりますか?PostgreSQL:削除と更新を組み合わせる

したがって、python3スクリプトは、変数(sheet1)と生の時系列(sheet2)の組み合わせであるスプレッドシートを読み取ります。スプレッドシートはデータ収集のための柔軟性があります。そのためです。

しかし、私は普及したシートのデータを変更するとつまずくようです。私はpostgresql 9.6を使用していますが、私はUPSERTを行う方法を知っています。

テーブルの1つは次のようになります。 | id | key_to_other_table |パラメータ|値|

UPSERTは、key_to_other_tableおよびパラメータがテーブルにあるかどうかに関係なく完璧に動作します。

問題は、パラメータが元々スプレッドシートにあり、データベースにアップロードされていたが、スプレッドシートで修正されたがデータベースにまだ残っているという問題です。

私は今、どうなる

...私は削除のいくつかの種類を行う必要があるが、私は、私はIDを使用してすべての行の鈍削除を行い、その後、単純に再挿入したくない

特定のスプレッドシートにリンクされている行のすべてのIDを取得し、値のアップカウントを行い、そのIDを取得します。

2つのリストを比較し、不要になったものを削除します。 しかし、これは3つの異なるデータベースクエリのようです... これを1ステップで行うためのエレガントな方法はありますか?

+0

このワーキングアップのユニークなキーは何ですか? –

+0

これは私にとって大きな混乱のように聞こえる。データを細かく正確に管理するための要件が​​ある場合は、スプレッドシートを使用しないようにアドバイスします。 Postgresはあなたのデータをホストするのに適しています。 –

+0

他の提案は大歓迎ですが、スプレッドシートで作業することは、オペレータの利便性と私が望むデータ構造との間の妥協です。スプレッドシートは構造化されており、テンプレートベースです。 – Ilpepe4

答えて

0

「ロード識別子」を使用してテーブルを拡張し、それをUPSERTで移入すると、予想しているロード識別子を持たないレコードがテーブルから削除されます。

一般フロー:

  1. ThisLoadIdentifier:=現在のタイムスタンプスプレッドシートから行アップサート
  2. 、設定load_identifier = ThisLoadIdentifier
  3. テーブルから削除load_identifier = ThisLoadIdentifier

サンプル!チュートリアル:

初期設定

varchar列のload_idを追加するように表を拡張します。

ALTER TABLE myTable ADD load_id VARCHAR;

| id | key_to_other_table | parameter | value | load_id |

初期値を持っているすべての既存の行を更新します。それは負荷をやって開始する前に

`UPDATE myTable SET load_id = 'Existing Records';` 

ロード

  1. 変更あなたのPythonスクリプトはよう、それはユニークなload_idを思い付きます。現在の時間のようなものなど、あなたのインサートで

    this_load_id = time.ctime()

  2. /アップサート新しいthis_load_id値でload_id列を移入。

  3. ロードが完了した後。挿入または更新する行にはすべてload_id = this_load_idが含まれます。 load_idにこの値がない行は、古いロードのもので、このスプレッドシートには含まれていません。

    delete from myTable where load_id != this_load_id

警告を削除あなたは、単純なとそれらを取り除くことができます:あなたは、おそらく生産の日付/時刻文字列よりも効率的なものを使用したいと思います。

+0

ああ、私の脳はちょうどポップアップした。いくつかの例やWebチュートリアル/例がありますか?私はcompletlyに従っています – Ilpepe4

+0

@ llpepe4私は詳細を追加しました。感謝! – Gary

+0

ありがとう!私はそのショットを与えるよ! – Ilpepe4

関連する問題