masayuki14 / worklog

Record working log by issues.
MIT License
0 stars 0 forks source link

postgres's tirgger & trigger function #7

Closed masayuki14 closed 6 years ago

masayuki14 commented 6 years ago

pgadmin で trigger function を登録してみる。

masayuki14 commented 6 years ago
2018-03-01 16 26 36 2018-03-01 16 26 23
masayuki14 commented 6 years ago

登録された内容をSQLで見るには

select prosrc  from pg_proc where proname = 'insert_trigger' limit 1 ;

なのだが 0row なんだよね。困った。

masayuki14 commented 6 years ago

insert_tirgger oh typo!!

masayuki14 commented 6 years ago
# select prosrc From pg_proc where proname = 'insert_trigger';
                 prosrc
-----------------------------------------
                                        +
  -- RETURNS trigger                    +
                                        +
  BEGIN                                 +
    NEW.created_at := CURRENT_TIMESTAMP;+
    NEW.updated_at := CURRENT_TIMESTAMP;+
    RETURN NEW;                         +
  END;                                  +
                                        +

(1 row)

OK

masayuki14 commented 6 years ago

このファンクションをトリガーに登録する。

masayuki14 commented 6 years ago

のまえに、ファンクション名を変えた。

insert_trigger => insert_trigger_function

masayuki14 commented 6 years ago
CREATE TRIGGER insert_trigger
    BEFORE INSERT
    ON public.tripadvisor_businesses
    FOR EACH ROW
    EXECUTE PROCEDURE public.insert_trigger_function();

COMMENT ON TRIGGER insert_trigger ON public.tripadvisor_businesses
    IS 'Set created_at and updated_at .';
masayuki14 commented 6 years ago
2018-03-01 16 55 12 2018-03-01 16 55 09 2018-03-01 16 55 07 2018-03-01 16 54 48
masayuki14 commented 6 years ago

いちどテーブルのデータを消して入れ直してみる。

masayuki14 commented 6 years ago
truncate tripadvisor_business;
masayuki14 commented 6 years ago
$ embulk run config.yml
masayuki14 commented 6 years ago
select * from tripadvisor_businesses limit 1;
-[ RECORD 1 ]----+--------------------------------------------------------------
---------------------------------------------------------
detail_url       | https://www.tripadvisor.com/Attraction_Review-g298564-d117491
2-Reviews-Yasaka_Shrine-Kyoto_Kyoto_Prefecture_Kinki.html
title            | Yasaka Shrine
rate             | 4.0
review           | 1254
part             | Gion
tags             | Sacred & Religious Sites,Historic Sites,Sights & Landmarks
rating5          | 351
rating4          | 640
rating3          | 238
rating2          | 13
rating1          | 13
street_address   | 625 Giommachi Kitagawa, Higashiyama-ku
address_locality | Kyoto
postal_code      | 605-0073,
place_id_g       | g298564
place_id_d       | d1174912
lng              | 135.7783
lat              | 35.003517
image            |
created_at       | 2018-03-01 08:13:21.622741
updated_at       | 2018-03-01 08:13:21.622741
masayuki14 commented 6 years ago

ちゃんと動いた。とりあえずOK。

コレをスクリプトで設定したいなぁ。

masayuki14 commented 6 years ago

update 用のtrigger_functionを登録する。

masayuki14 commented 6 years ago

pgAdmin から GUI で登録する。

masayuki14 commented 6 years ago

SQL タブに登録用のコードが吐かれてる。

masayuki14 commented 6 years ago

右クリックメニューの CREATE Script で後から見れる。

masayuki14 commented 6 years ago

JSONのデータ1つずつかえて updated_at が更新されるかテスト。

masayuki14 commented 6 years ago

OKだった・

masayuki14 commented 6 years ago
psql -U $POSTGRES_USER -d $POSTGRES_DB -f insert_trigger_function.plpgsql

SQLの実行になるので、 CREATE TABLE と同じようにコマンドラインから実行できる。

masayuki14 commented 6 years ago
ERROR:  function "insert_trigger_function" already exists with same argument types
ALTER FUNCTION

create だけだとエラーになる。

masayuki14 commented 6 years ago

ドキュメントどおりだと CREATE => CREATE OR REPLACE にすればOK。

# psql -U $POSTGRES_USER -d $POSTGRES_DB -f insert_trigger_function.plpgsql
CREATE FUNCTION
ALTER FUNCTION
masayuki14 commented 6 years ago

https://qiita.com/SRsawaguchi/items/411801e254ee66f511f1#%E9%96%A2%E6%95%B0%E3%81%AE%E4%BD%9C%E6%88%90-1

DROP FUNCTION IF EXISTS XXX(); を入れたほうがいいのか?

masayuki14 commented 6 years ago

CREATE TRIGGER には OR REPLACE とか IF EXISTS が無いので、さきに DROP するようにしよう。