▽1
●
a-kuma3 ●1500ポイント ベストアンサー |
SQLite には INSERT OR REPLACE というのがあります。
これを使うと、プライマリキーが重複するレコードがあると上書きしてくれます。
def treat_data data ... // ★ ↓ ここ! sql = 'insert or replace into TEPCO(blackout_time, recover_time, pref, city, area, blackout_count, blackout_reason, update_time) values (?, ?, ?, ?, ?, ?, ?, ?);' db.execute(sql, [blackout_time, recover_time, pref, city, area, blackout_count, blackout_reason, update_time]) ...
前回は手抜きして、通し番号の id なんてカラムを作ってプライマリキーにしましたが、もう必要ないですね。
id カラムを削除して、適当なキーをプライマリキーに指定してください。
例えば、発生時刻、都県、市町村あたりがプライマリキーでしょうか。
CREATE TABLE TEPCO ( blackout_time text, recover_time text, pref text, city text, area text, blackout_count text, blackout_reason text, update_time text, PRIMARY KEY(blackout_time,pref,city) );
停電情報が変わっていく様子も追っかけたい、というようなこともおっしゃってたので、用途に合わせてプライマリキーを決めてください。
def treat_data data ... # プライマリキーで数を確認 sql = 'select count(*) from TEPCO where blackout_time = ? and pref = ? and city = ?' rs = db.execute(sql, [blackout_time, pref, city]) # データが無かったら insert if rs[0][0] == 0 then sql = 'insert into TEPCO(blackout_time, recover_time, pref, city, area, blackout_count, blackout_reason, update_time) values (?, ?, ?, ?, ?, ?, ?, ?);' db.execute(sql, [blackout_time, recover_time, pref, city, area, blackout_count, blackout_reason, update_time]) # データがあったら update else sql = 'update TEPCO set blackout_time = ?, recover_time = ?, pref = ?, city = ?, area = ?, blackout_count = ?, blackout_reason = ?, update_time = ? where blackout_time = ? and pref = ? and city = ?' db.execute(sql, [blackout_time, recover_time, pref, city, area, blackout_count, blackout_reason, update_time, blackout_time, pref, city]) end
ひとつのデータを書き込むのにふたつの SQL を出してたりするような性能面のこともありますが、ぱっと見てわかるように何よりも見づらい。
見づらさはメンテナンス性を悪くします。
多分、ちょいちょいいじるプログラムになるんだと思います。
保存する DB のレイアウトを変えたりしたくなることもあるかもしれない。
そういった辺りを考えると、シンプルなソースにしておくのが良いと思います。