เชเชเซ เชนเซเช เชชเซเชธเซเชเชเซเชฐเซเชเชธเชเซเชฏเซเชเชฒ เชกเซเชฌเซเชเชฎเชเชธเชฎเชพเช เชเซเชฌเชฒ เชกเชฟเชชเซเชจเซเชกเชจเซเชธเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชชเชพเชฏเชฅเซเชจเชฎเชพเช เชฒเชเซเชฒเซ เชฏเซเชเชฟเชฒเชฟเชเซ เชธเชพเชฅเซ เชนเซเชฌเซเชฐ เชตเชพเชเชเซเชจเซ เชชเซเชฐเชธเซเชคเซเชค เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซเช.
เชเชชเชฏเซเชเชฟเชคเชพเชจเซเช API เชธเชฐเชณ เชเซ เช เชจเซ เชคเซเชฎเชพเช เชคเซเชฐเชฃ เชชเชฆเซเชงเชคเชฟเชเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ:
- เชเชฐเซเชเชพเชเชต_เชเซเชฌเชฒ - เชเชฒเซเชฒเซเชเชฟเชค เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ เชธเชพเชฅเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชเชฐเซเชเชพเชเชตเชฟเชเช/เชชเชเชเซเชคเชฟเช เชเชพเชขเซ เชจเชพเชเชตเซ
- เชฎเซเชณเชตเซ_เชเซเชทเซเชเช_เชธเชเชฆเชฐเซเชญ - เชเซเชทเซเชเช เชฎเชพเชเซ เช เชตเชฒเชเชฌเชจ เชฎเชพเชเซ เชถเซเชงเซ (เชเชฒเซเชฒเซเชเชฟเชค เชเช เชฆเซเชตเชพเชฐเชพ เชธเชเชฆเชฐเซเชญเชฟเชค เชเซเชทเซเชเชเซ เช เชจเซ เชคเซเชจเซ เชธเชเชฆเชฐเซเชญ เชฒเซเชจเชพเชฐเชพเช เชฌเชคเชพเชตเชถเซ)
- เชฎเซเชณเชตเซ_เชชเชเชเซเชคเชฟเช_เชธเชเชฆเชฐเซเชญ - เช เชจเซเชฏ เชเซเชทเซเชเชเซเชฎเชพเช เชชเชเชเซเชคเชฟเช เชฎเชพเชเซ เชถเซเชงเซ เชเซ เชเชเซเชเชฟเชค เชเซเชทเซเชเชเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชชเชเชเซเชคเชฟเชเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเซ เชเซ
เชชเซเชฐเชพเชเซเชคเชฟเชนเชพเชธเชฟเช
เชฎเชพเชฐเซเช เชจเชพเชฎ เชเชฒเซเช เชฌเซเชฐเซเชเซเชต เชเซ, เชนเซเช เชกเซเชฎเชเซเชฒเชฟเชเชฎเชพเช เชฎเซเชฐเซเชเชเซเช เชงเชฟเชฐเชพเชฃ เชธเชเชเชพเชฒเชเซ เชฎเชพเชเซเชจเซ CRM เชเซเชฎเชฎเชพเช เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชเซเช.
เช เชฎเชพเชฐเซ CRM เชธเชฟเชธเซเชเชฎเชจเซ เชฎเซเชเซเชฏ เชกเซเชเชพเชฌเซเช เชเชเชชเชจเซเชฎเชพเช เชตเซเชฒเซเชฏเซเชฎเชจเซ เชฆเซเชฐเชทเซเชเชฟเช เชธเซเชฅเซ เชฎเซเชเซ เชกเซเชเชพเชฌเซเช เชเซ. เชคเซ เชธเซเชฅเซ เชเซเชจเชพเชฎเชพเชเชจเซเช เชเช เชชเชฃ เชเซ: เชคเซ เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชเซเชฌ เช เชฒเซเชจเซเช เชธเชฎเชฏเซ เชฆเซเชเชพเชฏเซ, เชเซเชฏเชพเชฐเซ เชตเซเชเซเชทเซ เชฎเซเชเชพ เชนเชคเชพ, เชกเซเชฎเชเซเชฒเชฟเช เชเช เชธเซเชเชพเชฐเซเชเช เชช เชนเชคเซเช, เช เชจเซ เชซเซเชถเชจเซเชฌเชฒ เชชเชพเชฏเชฅเซเชจ เช เชธเซเชฎเซเชณ เชซเซเชฐเซเชฎเชตเชฐเซเช เชชเชฐ เชฎเชพเชเชเซเชฐเซเชธเชฐเซเชตเชฟเชธเชจเซ เชฌเชฆเชฒเซ PHP เชฎเชพเช เชเช เชตเชฟเชถเชพเชณ เชฎเซเชจเซเชฒเชฟเชฅ เชนเชคเซเช.
PHP เชฅเซ Python เชธเซเชงเซเชจเซเช เชธเชเชเซเชฐเชฎเชฃ เชเชฃเซเช เชฒเชพเชเชฌเซ เชนเชคเซเช เช เชจเซ เชฌเชเชจเซ เชธเชฟเชธเซเชเชฎเชจเชพ เชเช เชธเชพเชฅเซ เชธเชฎเชฐเซเชฅเชจเชจเซ เชเชฐเซเชฐ เชนเชคเซ, เชเซเชฃเซ เชกเซเชเชพเชฌเซเชเชจเซ เชกเชฟเชเชพเชเชจเชจเซ เช เชธเชฐ เชเชฐเซ เชนเชคเซ.
เชชเชฐเชฟเชฃเชพเชฎเซ, เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชตเชฟเชตเชฟเชง เชชเซเชฐเชเชพเชฐเชจเซ เชเซเชตเซเชฐเซเช เชฎเชพเชเซ เชเชจเซเชกเซเชเซเชธเชจเชพ เชธเชฎเซเชน เชธเชพเชฅเซ เชฎเซเชเซ เชธเชเชเซเชฏเชพเชฎเชพเช เช เชคเซเชฏเชเชค เชเชจเซเชเซเชเซเชก เช เชจเซ เชตเชฟเชถเชพเชณ เชเซเชทเซเชเชเซ เชงเชฐเชพเชตเชคเซ เชกเซเชเชพเชฌเซเช เชเซ. เช เชฌเชงเซเช เชกเซเชเชพเชฌเซเชเชจเชพ เชชเซเชฐเชญเชพเชตเชจเซ เชจเชเชพเชฐเชพเชคเซเชฎเช เชฐเซเชคเซ เช เชธเชฐ เชเชฐเซ เชเซ: เชฎเซเชเชพ เชเซเชทเซเชเชเซ เช เชจเซ เชคเซเชฎเชจเซ เชตเชเซเชเซเชจเชพ เชธเชเชฌเชเชงเซเชจเชพ เชธเชฎเซเชนเชจเซ เชฒเซเชงเซ, เชชเซเชฐเชถเซเชจเซเชจเซ เชเชเชฟเชฒเชคเชพ เชธเชคเชค เชตเชงเซ เชฐเชนเซ เชเซ, เชเซ เชเชพเชธ เชเชฐเซเชจเซ เชธเซเชฅเซ เชตเชงเซ เชฒเซเชก เชเชฐเซเชฒเชพ เชเซเชทเซเชเชเซ เชฎเชพเชเซ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ.
เชกเซเชเชพเชฌเซเช เชชเชฐเชจเซ เชญเชพเชฐ เชเชเชพเชกเชตเชพ เชฎเชพเชเซ, เช
เชฎเซ เชเช เชธเซเชเซเชฐเชฟเชชเซเช เชฒเชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชเซ เชเซเชจเชพ เชฐเซเชเซเชฐเซเชกเซเชธเชจเซ เชธเซเชฅเซ เชตเชงเซ เชตเชฟเชถเชพเชณ เช
เชจเซ เชฒเซเชก เชเชฐเซเชฒเชพ เชเซเชทเซเชเชเซเชฎเชพเชเชฅเซ เชเชฐเซเชเชพเชเชต เชเชฐเซเชฒเชพ เชเซเชทเซเชเชเซเชฎเชพเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชถเซ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช
เชนเซเชเชฅเซ task
ะฒ task_archive
).
เช เชเชพเชฐเซเชฏ เชเซเชทเซเชเชเซ เชตเชเซเชเซเชจเชพ เชฎเซเชเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชธเชเชฌเชเชงเซ เชฆเซเชตเชพเชฐเชพ เชเชเชฟเชฒ เชเซ: เชซเชเซเชค เชชเชเชเซเชคเชฟเชเชฅเซ เชเชธเซเชกเซ task
ะฒ task_archive
เชคเซ เชชเซเชฐเชคเซเช เชจเชฅเซ, เชคเซ เชชเชนเซเชฒเชพเช เชคเชฎเชพเชฐเซ เชคเซ เชฌเชงเชพ เชธเชเชฆเชฐเซเชญเซ เชธเชพเชฅเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเซเชคเซ เชคเซ เช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ task
เชเซเชทเซเชเชเซ
เชนเซเช เชเช เชเชฆเชพเชนเชฐเชฃ เชธเชพเชฅเซ เชฆเชฐเซเชถเชพเชตเซเชถ
เชเชพเชฒเซ เชเชนเซเช เชเซ เชเชชเชฃเซ เชเซเชฌเชฒเชฎเชพเชเชฅเซ เชฐเซเชเซเชฐเซเชกเซเชธ เชเชพเชขเซ เชจเชพเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ Flights
. เชชเซเชธเซเชเชเซเชฐเซเชธ เช
เชฎเชจเซ เชเชจเซ เชเซเชฎ เช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ เชจเชนเซเช: เชเชชเชฃเซ เชชเชนเซเชฒเชพ เชฌเชงเชพ เชธเชเชฆเชฐเซเชญ เชเซเชทเซเชเชเซเชฎเชพเชเชฅเซ เชฐเซเชเซเชฐเซเชกเซเชธ เชเชพเชขเซ เชจเชพเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เช
เชจเซ เชคเซเชฅเซ เช เชเซเชเชจเชพ เชฆเซเชตเชพเชฐเชพ เชธเชเชฆเชฐเซเชญเชฟเชค เชจ เชนเซเชฏ เชคเซเชตเชพ เชเซเชทเซเชเชเซ เชชเชฐ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเซเชคเซ เชจเซเชเซ เชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เช
เชฎเชพเชฐเชพ เชเชฆเชพเชนเชฐเชฃเชฎเชพเช Flights
เชเชฒเซเชฒเซเช เชเชฐเซ เชเซ Ticket_flights
, เช
เชจเซ เชคเซเชจเชพ เชชเชฐ - Boarding_passes
.
เชคเซเชฅเซ, เชคเชฎเชพเชฐเซ เชคเซเชจเซ เช เชเซเชฐเชฎเชฎเชพเช เชเชพเชขเซ เชจเชพเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
- เช
เชฎเชจเซ เชชเชเชเซเชคเชฟเชเชจเซ เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ (PK) เชเชฟเชเชฎเชคเซ เชฎเชณเซ เชเซ
Ticket_flights
, เชเซ เชเชพเชขเซ เชจเชพเชเชตเชพเชจเซ เชชเชเชเซเชคเชฟเชเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเซ เชเซFlights
. - เช
เชฎเชจเซ PK เชชเชเชเซเชคเชฟเช เชฎเชณเซ เชเซ
Boarding_passes
, เชเซเชจเซ เชธเชเชฆเชฐเซเชญ เชฒเซTicket_flights
. - เช
เชฎเซ เชเซเชทเซเชเชเชฎเชพเช เชชเชเชฒเซเช 2 เชฎเชพเชเชฅเซ PK เชฆเซเชตเชพเชฐเชพ เชชเชเชเซเชคเชฟเช เชเชพเชขเซ เชจเชพเชเซเช เชเซเช
Boarding_passes
. - เชชเชเชฒเซเช 1 เชฎเชพเช เชฅเซ PK เชฆเซเชตเชพเชฐเชพ เชฐเซเชเชพเช เชเชพเชขเซ เชจเชพเชเซ
Ticket_flights
. - เชฎเชพเชเชฅเซ เชฒเซเชเซเช เชฆเซเชฐ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
Flights
.
เชชเชฐเชฟเชฃเชพเชฎ เช PgGraph เชจเชพเชฎเชจเซ เชเชชเชฏเซเชเชฟเชคเชพ เชนเชคเซ, เชเซเชจเซ เช เชฎเซ เชเชชเชจ เชธเซเชฐเซเชธ เชฌเชจเชพเชตเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช.
เชเซเชตเซ เชฐเซเชคเซ เชเชชเชฏเซเช เชเชฐเชตเซ
เชเชชเชฏเซเชเชฟเชคเชพ เชเชชเชฏเซเชเชจเชพ เชฌเซ เชฎเซเชกเชจเซ เชธเชชเซเชฐเซเช เชเชฐเซ เชเซ:
- เชเชฆเซเชถ เชตเชพเชเซเชฏเชฎเชพเชเชฅเซ เชเซเชฒ เชเชฐเซ (
pggraph โฆ
). - ะัะฟะพะปัะทะพะฒะฐะฝะธะต ะฒ ะบะพะดะต Python (ะบะปะฐัั
PgGraphApi
).
เชธเซเชฅเชพเชชเชจ เช เชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ
เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ Pypi เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเชเชฅเซ เชเชชเชฏเซเชเชฟเชคเชพเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
pip3 install pggraph
เชชเชเซ เชกเซเชเชพเชฌเซเชเชจเชพ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เช เชจเซ เชเชฐเซเชเชพเชเชตเชฟเชเช เชธเซเชเซเชฐเชฟเชชเซเช เชธเชพเชฅเซ เชธเซเชฅเชพเชจเชฟเช เชฎเชถเซเชจ เชชเชฐ config.ini เชซเชพเชเชฒ เชฌเชจเชพเชตเซ:
[db]
host = localhost
port = 5432
user = postgres
password = postgres
dbname = postgres
schema = public ; ะะตะพะฑัะทะฐัะตะปัะฝัะน ะฟะฐัะฐะผะตัั, ัะบะฐะทะฐะฝะพ ะทะฝะฐัะตะฝะธะต ะฟะพ ัะผะพะปัะฐะฝะธั
[archive] ; ะะฐะฝะฝัะน ัะฐะทะดะตะป ะทะฐะฟะพะปะฝััั ะฝะตะพะฑัะทะฐัะตะปัะฝะพ, ะฝะธะถะต ัะบะฐะทะฐะฝั ะทะฝะฐัะตะฝะธั ะฟะพ ัะผะพะปัะฐะฝะธั
is_debug = false
chunk_size = 1000
max_depth = 20
to_archive = true
archive_suffix = 'archive'
เชเชจเซเชธเซเชฒเชฅเซ เชเชฒเชพเชตเซ
เชชเชฐเชฟเชฎเชพเชฃเซ
$ pggraph -h
usage: pggraph action [-h] --table TABLE [--ids IDS] [--config_path CONFIG_PATH]
positional arguments:
action required action: archive_table, get_table_references, get_rows_references
optional arguments:
-h, --help show this help message and exit
--table TABLE table name
--ids IDS primary key ids, separated by comma, e.g. 1,2,3
--config_path CONFIG_PATH path to config.ini
--log_path LOG_PATH path to log dir
--log_level LOG_LEVEL log level (debug, info, error)
เชธเซเชฅเชฟเชคเชฟเชเซเชฏ เชฆเชฒเซเชฒเซ:
action
- เชเชฐเซเชฐเซ เชเชพเชฐเซเชฏเชตเชพเชนเซ:archive_table
,get_table_references
เช เชฅเชตเชพget_rows_references
.
เชจเชพเชฎเชตเชพเชณเซ เชฆเชฒเซเชฒเซ:
--config_path
- เชฐเซเชชเชฐเซเชเชพ เชซเชพเชเชฒเชจเซ เชชเชพเชฅ;--table
- เชเช เชเซเชฌเชฒ เชเซ เชเซเชจเซ เชธเชพเชฅเซ เชคเชฎเชพเชฐเซ เชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ;--ids
- เช เชฒเซเชชเชตเชฟเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เช เชฒเช เชเชฐเชพเชฏเซเชฒ id เชจเซ เชธเซเชเชฟ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ,1,2,3
(เชตเซเชเชฒเซเชชเชฟเช เชชเชฐเชฟเชฎเชพเชฃ);--log_path
โ เชฒเซเช เชฎเชพเชเซ เชซเซเชฒเซเชกเชฐเชจเซ เชชเชพเชฅ (เชตเซเชเชฒเซเชชเชฟเช เชชเชฐเชฟเชฎเชพเชฃ, เชฎเซเชณเชญเซเชค เชฐเซเชคเซ โ เชนเซเชฎ เชซเซเชฒเซเชกเชฐ);--log_level
- เชฒเซเชเซเชเช เชธเซเชคเชฐ (เชตเซเชเชฒเซเชชเชฟเช เชชเชฐเชฟเชฎเชพเชฃ, เชกเชฟเชซเซเชฒเซเช INFO เชเซ).
เชเชฆเซเชถ เชเชฆเชพเชนเชฐเชฃเซ
เชเช เชเซเชฌเชฒ เชเชฐเซเชเชพเชเชตเชฟเชเช
เชเชชเชฏเซเชเชฟเชคเชพเชจเซเช เชฎเซเชเซเชฏ เชเชพเชฐเซเชฏ เชกเซเชเชพ เชเชฐเซเชเชพเชเชตเชฟเชเช เชเซ, เชเชเชฒเซ เชเซ. เชฎเซเชเซเชฏ เชเซเชทเซเชเชเชฎเชพเชเชฅเซ เชเชฐเซเชเชพเชเชต เชเซเชฌเชฒ เชชเชฐ เชชเชเชเซเชคเชฟเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเชตเซ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชทเซเชเชเชฎเชพเชเชฅเซ เชชเซเชธเซเชคเชเซ ะฒ เชชเซเชธเซเชคเชเซ_เชเชฐเซเชเชพเชเชต).
เชเชฐเซเชเชพเชเชต เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ เชเชพเชขเซ เชจเชพเชเชตเชพเชจเซเช เชชเชฃ เชธเชฎเชฐเซเชฅเชจ เชเซ: เช เชฎเชพเชเซ เชคเชฎเชพเชฐเซ config.ini เชฎเชพเช เชชเชฐเชฟเชฎเชพเชฃ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ to_archive = เชเซเชเชพ).
เชเชฐเซเชฐเซ เชชเชฐเชฟเชฎเชพเชฃเซ - config_path, เชเซเชทเซเชเช เช เชจเซ ids.
เชฒเซเชเช เชเชฐเซเชฏเชพ เชชเชเซ, เชฐเซเชเซเชฐเซเชกเซเชธ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเซเชคเซ เชเชพเชขเซ เชจเชพเชเชตเชพเชฎเชพเช เชเชตเชถเซ ids
เชเซเชฌเชฒเชฎเชพเช table
เช
เชจเซ เชคเซเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเชคเชพ เชคเชฎเชพเชฎ เชเซเชทเซเชเชเซเชฎเชพเช.
$ pggraph archive_table --config_path config.hw.local.ini --table flights --ids 1,2,3
2020-06-20 19:27:44 INFO: flights - START
2020-06-20 19:27:44 INFO: flights - start archive_recursive 3 rows (depth=0)
2020-06-20 19:27:44 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: ticket_flights - start archive_recursive 3 rows (depth=1)
2020-06-20 19:27:44 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: boarding_passes - start archive_recursive 3 rows (depth=2)
2020-06-20 19:27:44 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: boarding_passes - archive_by_ids 3 rows by ticket_no, flight_id
2020-06-20 19:27:44 INFO: boarding_passes - start archive_recursive 3 rows (depth=2)
2020-06-20 19:27:44 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: boarding_passes - archive_by_ids 3 rows by ticket_no, flight_id
2020-06-20 19:27:44 INFO: boarding_passes - start archive_recursive 3 rows (depth=2)
2020-06-20 19:27:44 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: boarding_passes - archive_by_ids 3 rows by ticket_no, flight_id
2020-06-20 19:27:44 INFO: boarding_passes - start archive_recursive 3 rows (depth=2)
2020-06-20 19:27:44 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: boarding_passes - archive_by_ids 3 rows by ticket_no, flight_id
2020-06-20 19:27:44 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: ticket_flights - archive_by_ids 3 rows by ticket_no, flight_id
2020-06-20 19:27:44 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 19:27:44 INFO: flights - archive_by_ids 3 rows by id
2020-06-20 19:27:44 INFO: flights - END
เชเชฒเซเชฒเซเชเชฟเชค เชเซเชทเซเชเช เชฎเชพเชเซ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชถเซเชงเซ
เชเชฒเซเชฒเซเชเชฟเชค เชเซเชทเซเชเชเชจเซ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชถเซเชงเชตเชพเชจเซเช เชเชพเชฐเซเชฏ table
. เชเชฐเซเชฐเซ เชชเชฐเชฟเชฎเชพเชฃเซ - config_path
ะธ table
.
เชฒเซเชจเซเช เชเชฐเซเชฏเชพ เชชเชเซ, เชธเซเชเซเชฐเซเชจ เชชเชฐ เชเช เชถเชฌเซเชฆเชเซเชถ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ, เชเซเชฏเชพเช:
in_refs
- เชเชชเซเชฒเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเชคเชพ เชเซเชทเซเชเชเซเชจเซ เชถเชฌเซเชฆเชเซเชถ, เชเซเชฏเชพเช เชเซ เช เชเซเชทเซเชเชเชจเซเช เชจเชพเชฎ เชเซ, เชฎเซเชฒเซเชฏ เชตเชฟเชฆเซเชถเซ เชเซ เชตเชธเซเชคเซเชเชจเซ เชธเซเชเชฟ เชเซ (pk_main
- เชฎเซเชเซเชฏ เชเซเชทเซเชเชเชฎเชพเช เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ,pk_ref
- เชธเชเชฆเชฐเซเชญ เชเซเชทเซเชเชเชฎเชพเช เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ,fk_ref
โ เชเซเชฒเชฎเชจเซเช เชจเชพเชฎ เชเซ เชธเซเชคเซเชฐเซเชค เชเซเชทเซเชเชเชจเซ เชตเชฟเชฆเซเชถเซ เชเซ เชเซ);out_refs
- เชเซเชทเซเชเชเซเชจเซ เชถเชฌเซเชฆเชเซเชถ เชเซเชจเซ เช เชเชฒเซเชฒเซเช เชเชฐเซ เชเซ.
$ pggraph get_table_references --config_path config.hw.local.ini --table flights
{'in_refs': {'ticket_flights': [ForeignKey(pk_main='flight_id', pk_ref='ticket_no, flight_id', fk_ref='flight_id')]},
'out_refs': {'aircrafts': [ForeignKey(pk_main='aircraft_code', pk_ref='flight_id', fk_ref='aircraft_code')],
'airports': [ForeignKey(pk_main='airport_code', pk_ref='flight_id', fk_ref='arrival_airport'),
ForeignKey(pk_main='airport_code', pk_ref='flight_id', fk_ref='departure_airport')]}}
เชเชฒเซเชฒเซเชเชฟเชค เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ เชธเชพเชฅเซ เชถเชฌเซเชฆเชฎเชพเชณเชพเชเชจเชพ เชธเชเชฆเชฐเซเชญเซ เชถเซเชงเชตเซ
เช
เชจเซเชฏ เชเซเชทเซเชเชเซเชฎเชพเช เชชเชเชเซเชคเชฟเช เชถเซเชงเชตเชพเชจเซเช เชเชพเชฐเซเชฏ เชเซ เชตเชฟเชฆเซเชถเซ เชเซ เชฆเซเชตเชพเชฐเชพ เชชเชเชเซเชคเชฟเชเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเซ เชเซ ids
เชเซเชทเซเชเชเซ table
. เชเชฐเซเชฐเซ เชชเชฐเชฟเชฎเชพเชฃเซ - config_path
, table
ะธ ids
.
เชฒเซเชจเซเช เชเชฐเซเชฏเชพ เชชเชเซ, เชธเซเชเซเชฐเซเชจ เชชเชฐ เชจเซเชเซเชจเซ เชฐเชเชจเชพ เชธเชพเชฅเซเชจเซ เชถเชฌเซเชฆเชเซเชถ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ:
{
pk_id_1: {
reffering_table_name_1: {
foreign_key_1: [
{row_pk_1: value, row_pk_2: value},
...
],
...
},
...
},
pk_id_2: {...},
...
}
เชเชฆเชพเชนเชฐเชฃ เชเซเชฒ:
$ pggraph get_rows_references --config_path config.hw.local.ini --table flights --ids 1,2,3
{1: {'ticket_flights': {'flight_id': [{'flight_id': 1,
'ticket_no': '0005432816945'},
{'flight_id': 1,
'ticket_no': '0005432816941'}]}},
2: {'ticket_flights': {'flight_id': [{'flight_id': 2,
'ticket_no': '0005433101832'},
{'flight_id': 2,
'ticket_no': '0005433101864'},
{'flight_id': 2,
'ticket_no': '0005432919715'}]}},
3: {'ticket_flights': {'flight_id': [{'flight_id': 3,
'ticket_no': '0005432817560'},
{'flight_id': 3,
'ticket_no': '0005432817568'},
{'flight_id': 3,
'ticket_no': '0005432817559'}]}}}
เชเซเชกเชฎเชพเช เชเชชเชฏเซเช
เชคเซเชจเซ เชเชจเซเชธเซเชฒเชฎเชพเช เชเชฒเชพเชตเชตเชพ เชเชชเชฐเชพเชเชค, เชชเชพเชฏเชฅเซเชจ เชเซเชกเชฎเชพเช เชฒเชพเชเชฌเซเชฐเซเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ. iPython เชเชจเซเชเชฐเซเชเซเชเชฟเชต เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชเซเชฒเชจเชพ เชเชฆเชพเชนเชฐเชฃเซ เชจเซเชเซ เชฌเชคเชพเชตเซเชฒ เชเซ.
เชเช เชเซเชฌเชฒ เชเชฐเซเชเชพเชเชตเชฟเชเช
>>> from pg_graph.main import setup_logging
>>> setup_logging(log_level='DEBUG')
>>> from pg_graph.api import PgGraphApi
>>> api = PgGraphApi('config.hw.local.ini')
>>> api.archive_table('flights', [4,5])
2020-06-20 23:12:08 INFO: flights - START
2020-06-20 23:12:08 INFO: flights - start archive_recursive 2 rows (depth=0)
2020-06-20 23:12:08 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 DEBUG: ticket_flights - ForeignKey(pk_main='flight_id', pk_ref='flight_id, ticket_no', fk_ref='flight_id')
2020-06-20 23:12:08 DEBUG: SQL('SELECT flight_id, ticket_no FROM bookings.ticket_flights WHERE (flight_id) IN (%s, %s)')
2020-06-20 23:12:08 INFO: ticket_flights - start archive_recursive 30 rows (depth=1)
2020-06-20 23:12:08 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 DEBUG: boarding_passes - ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 INFO: boarding_passes - archive_by_fk 30 rows by ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.boarding_passes_archive (LIKE bookings.boarding_passes)')
2020-06-20 23:12:08 DEBUG: DELETE FROM boarding_passes by FK flight_id, ticket_no - 30 rows
2020-06-20 23:12:08 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 INFO: ticket_flights - archive_by_ids 30 rows by flight_id, ticket_no
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.ticket_flights_archive (LIKE bookings.ticket_flights)')
2020-06-20 23:12:08 DEBUG: DELETE FROM ticket_flights by flight_id, ticket_no - 30 rows
2020-06-20 23:12:08 DEBUG: INSERT INTO ticket_flights_archive - 30 rows
2020-06-20 23:12:08 INFO: ticket_flights - start archive_recursive 30 rows (depth=1)
2020-06-20 23:12:08 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 DEBUG: boarding_passes - ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 INFO: boarding_passes - archive_by_fk 30 rows by ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.boarding_passes_archive (LIKE bookings.boarding_passes)')
2020-06-20 23:12:08 DEBUG: DELETE FROM boarding_passes by FK flight_id, ticket_no - 30 rows
2020-06-20 23:12:08 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 INFO: ticket_flights - archive_by_ids 30 rows by flight_id, ticket_no
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.ticket_flights_archive (LIKE bookings.ticket_flights)')
2020-06-20 23:12:08 DEBUG: DELETE FROM ticket_flights by flight_id, ticket_no - 30 rows
2020-06-20 23:12:08 DEBUG: INSERT INTO ticket_flights_archive - 30 rows
2020-06-20 23:12:08 INFO: ticket_flights - start archive_recursive 30 rows (depth=1)
2020-06-20 23:12:08 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 DEBUG: boarding_passes - ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 INFO: boarding_passes - archive_by_fk 30 rows by ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.boarding_passes_archive (LIKE bookings.boarding_passes)')
2020-06-20 23:12:08 DEBUG: DELETE FROM boarding_passes by FK flight_id, ticket_no - 30 rows
2020-06-20 23:12:08 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 INFO: ticket_flights - archive_by_ids 30 rows by flight_id, ticket_no
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.ticket_flights_archive (LIKE bookings.ticket_flights)')
2020-06-20 23:12:08 DEBUG: DELETE FROM ticket_flights by flight_id, ticket_no - 30 rows
2020-06-20 23:12:08 DEBUG: INSERT INTO ticket_flights_archive - 30 rows
2020-06-20 23:12:08 INFO: ticket_flights - start archive_recursive 3 rows (depth=1)
2020-06-20 23:12:08 INFO: START ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 DEBUG: boarding_passes - ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 INFO: boarding_passes - archive_by_fk 3 rows by ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no')
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.boarding_passes_archive (LIKE bookings.boarding_passes)')
2020-06-20 23:12:08 DEBUG: DELETE FROM boarding_passes by FK flight_id, ticket_no - 3 rows
2020-06-20 23:12:08 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 INFO: ticket_flights - archive_by_ids 3 rows by flight_id, ticket_no
2020-06-20 23:12:08 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.ticket_flights_archive (LIKE bookings.ticket_flights)')
2020-06-20 23:12:08 DEBUG: DELETE FROM ticket_flights by flight_id, ticket_no - 3 rows
2020-06-20 23:12:08 DEBUG: INSERT INTO ticket_flights_archive - 3 rows
2020-06-20 23:12:08 INFO: END ARCHIVE REFERRING TABLES
2020-06-20 23:12:08 INFO: flights - archive_by_ids 2 rows by flight_id
2020-06-20 23:12:09 DEBUG: SQL('CREATE TABLE IF NOT EXISTS bookings.flights_archive (LIKE bookings.flights)')
2020-06-20 23:12:09 DEBUG: DELETE FROM flights by flight_id - 2 rows
2020-06-20 23:12:09 DEBUG: INSERT INTO flights_archive - 2 rows
2020-06-20 23:12:09 INFO: flights - END
เชเชฒเซเชฒเซเชเชฟเชค เชเซเชทเซเชเช เชฎเชพเชเซ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชถเซเชงเซ
>>> from pg_graph.api import PgGraphApi
>>> from pprint import pprint
>>> api = PgGraphApi('config.hw.local.ini')
>>> res = api.get_table_references('flights')
>>> pprint(res)
{'in_refs': {'ticket_flights': [ForeignKey(pk_main='flight_id', pk_ref='flight_id, ticket_no', fk_ref='flight_id')]},
'out_refs': {'aircrafts': [ForeignKey(pk_main='aircraft_code', pk_ref='flight_id', fk_ref='aircraft_code')],
'airports': [ForeignKey(pk_main='airport_code', pk_ref='flight_id', fk_ref='arrival_airport'),
ForeignKey(pk_main='airport_code', pk_ref='flight_id', fk_ref='departure_airport')]}}
เชเชฒเซเชฒเซเชเชฟเชค เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ เชธเชพเชฅเซ เชถเชฌเซเชฆเชฎเชพเชณเชพเชเชจเชพ เชธเชเชฆเชฐเซเชญเซ เชถเซเชงเชตเซ
>>> from pg_graph.api import PgGraphApi
>>> from pprint import pprint
>>> api = PgGraphApi('config.hw.local.ini')
>>> rows = api.get_rows_references('flights', [1,2,3])
>>> pprint(rows)
{1: {'ticket_flights': {'flight_id': [{'flight_id': 1,
'ticket_no': '0005432816945'},
{'flight_id': 1,
'ticket_no': '0005432816941'}]}},
2: {'ticket_flights': {'flight_id': [{'flight_id': 2,
'ticket_no': '0005433101832'},
{'flight_id': 2,
'ticket_no': '0005433101864'},
{'flight_id': 2,
'ticket_no': '0005432919715'}]}},
3: {'ticket_flights': {'flight_id': [{'flight_id': 3,
'ticket_no': '0005432817560'},
{'flight_id': 3,
'ticket_no': '0005432817568'},
{'flight_id': 3,
'ticket_no': '0005432817559'}]}}}
เชชเซเชธเซเชคเชเชพเชฒเชฏเชจเซ เชธเซเชคเซเชฐเซเชค เชเซเชก เช
เชนเซเช เชเชชเชฒเชฌเซเชง เชเซ
เชฎเชจเซ เชเชฟเชชเซเชชเชฃเซเช, เชชเซเชฐเชคเชฟเชฌเชฆเซเชงเชคเชพเช เช เชจเซ เชธเซเชเชจเซเชฎเชพเช เชเชจเชเชฆ เชฅเชถเซ.
เชนเซเช เช
เชนเซเช เช
เชจเซ เชญเชเชกเชพเชฐเชฎเชพเช เชฎเชพเชฐเซ เชถเซเชฐเซเชทเซเช เชเซเชทเชฎเชคเชพ เชฎเซเชเชฌ เชชเซเชฐเชถเซเชจเซเชจเชพ เชเชตเชพเชฌ เชเชชเชตเชพเชจเซ เชชเซเชฐเชฏเชคเซเชจ เชเชฐเซเชถ.
เชธเซเชฐเซเชธ: www.habr.com