เบกเบทเปเบเบตเปเบเปเบญเบเบขเบฒเบเบเปเบฒเบชเบฐเปเบซเบเบตเบเบนเปเบญเปเบฒเบ Habr เบเปเบงเบเบเบปเบเบเบฐเปเบซเบเบเบเบตเปเบเบฝเบเปเบ Python เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเบฒเบเบฐเบฅเบฒเบ dependencies เปเบ PostgreSQL DBMS.
API เบเบญเบเบเบปเบเบเบฐเปเบซเบเบเปเบกเปเบเบเปเบฒเบเบเบฒเบเปเบฅเบฐเบเบฐเบเบญเบเบเปเบงเบเบชเบฒเบกเบงเบดเบเบตเบเบฒเบ:
- archive_table - เบเบฒเบโเปเบเบฑเบโเบเบทเบ / เบฅเบถเบโเปเบเบงโเบเบตเปโเบกเบตโเบเบฐโเปเบโเบซเบผเบฑเบโเบเบตเปโเบฅเบฐโเบเบธโเปเบงเปโ
- get_table_references โ เบเบปเปเบโเบซเบฒโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบญเบตเบโเปเบชเปโเบชเปเบฒโเบฅเบฑเบโเบเบฒโเบเบฐโเบฅเบฒเบ (เบเบฐโเบชเบฐโเปเบเบโเปเบซเปโเปเบซเบฑเบโเบเบฒโเบเบฐโเบฅเบฒเบโเบญเปเบฒเบโเบญเบตเบโเปเบเบโเบเบฒเบโเบชเบฐโเปเบเบโเปเบซเปโเปเบซเบฑเบโเปเบฅเบฐโเบเบนเปโเบเบตเปโเบญเปเบฒเบโเปเบเบดเบโเบกเบฑเบโ)
- get_rows_references - เบเบปเปเบเบซเบฒเปเบเบงเปเบเบเบฒเบเบฐเบฅเบฒเบเบญเบทเปเบเปเบเบตเปเบญเปเบฒเบเบญเบตเบเปเบชเปเปเบเบงเบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบเปเบญเบเบเบฒเบ
เบเบฐเบงเบฑเบเบชเบฒเบ
เบเปเบญเบเบเบทเป Oleg Borzov, เบเปเบญเบเปเบเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบเบเบตเบก CRM เบชเปเบฒเบฅเบฑเบเบเบนเปเบเบฑเบเบเบฒเบเบชเบดเบเปเบเบทเปเบญเบเปเบฒเบเบญเบเปเบ Domklik.
เบเบฒเบเบเปเปเบกเบนเบเบเบปเปเบเบเปเบเบญเบเบฅเบฐเบเบปเบ CRM เบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบกเปเบเบซเบเบถเปเบเปเบเบเบตเปเปเบซเบเปเบเบตเปเบชเบธเบเปเบเปเบเปเบเบญเบเบเบฐเบฅเบดเบกเบฒเบเบเบญเบเบเปเบฅเบดเบชเบฑเบ. เบกเบฑเบเบเบฑเบเปเบเบฑเบเบซเบเบถเปเบเปเบเบเบตเปเปเบเบปเปเบฒเปเบเปเบเบตเปเบชเบธเบ: เบกเบฑเบเบเบฒเบเบปเบเบขเบนเปเปเบเบเบฒเบเปเบเบตเบเบเบปเบงเปเบเบเบเบฒเบ, เปเบกเบทเปเบญเบเบปเปเบเปเบกเปเปเบซเบเป, Domklik เปเบกเปเบเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบ, เปเบฅเบฐเปเบเบเบเบตเปเบเบฐเปเบเบฑเบ microservice เปเบเบเบญเบเบเบปเบเบญเบฑเบเปเบเบ: Python asynchronous เบกเบต monolith เบเบฐเบซเบเบฒเบเปเบซเบเปเปเบ PHP.
เบเบฒเบเบซเบฑเบเบเปเบฝเบเบเบฒเบ PHP เปเบ Python เปเบกเปเบเบเบฒเบงเบซเบผเบฒเบเปเบฅเบฐเบเปเบญเบเบเบฒเบเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเปเบญเบกเบเบฑเบเบเบญเบเบเบฑเบเบชเบญเบเบฅเบฐเบเบปเบ, เปเบเบดเปเบเบเบปเบเบเบฐเบเบปเบเบเปเปเบเบฒเบเบญเบญเบเปเบเบเบเบฒเบเบเปเปเบกเบนเบ.
เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฒเบเบเปเปเบกเบนเบเบเบตเปเบกเบตเบเปเบฒเบเบงเบเบเบฐเบซเบเบฒเบเปเบซเบเปเบเบญเบเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบกเบตเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบชเบนเบเปเบฅเบฐเบเบฐเบซเบเบฒเบเปเบซเบเปเบเบตเปเบกเบตเบเปเปเบเบญเบเบเบฑเบเบชเบฐเบเบตเบชเปเบฒเบฅเบฑเบเบเบฐเปเบเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบเบญเบเบเบฒเบเบชเบญเบเบเบฒเบก. เบเบฑเบเบซเบกเบปเบเบเบตเปเบกเบตเบเบปเบเบเบฐเบเบปเบเบเบฒเบเบฅเบปเบเบเปเปเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบเบฒเบเบเปเปเบกเบนเบ: เปเบเบทเปเบญเบเบเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเบฐเบซเบเบฒเบเปเบซเบเปเปเบฅเบฐเบเปเปเบเบญเบเบเบฒเบเบเบปเบงเบเบฑเบเบฅเบฐเบซเบงเปเบฒเบเบเบงเบเปเบเบปเบฒ, เบเบงเบฒเบกเบชเบฑเบเบชเบปเบเบเบญเบเบเบฒเบเบชเบญเบเบเบฒเบกเปเบกเปเบเปเบเบตเปเบกเบเบถเปเบเบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบ, เปเบเบดเปเบเปเบเบฑเบเบชเบดเปเบเบชเปเบฒเบเบฑเบเปเบเบเบชเบฐเปเบเบฒเบฐเบชเปเบฒเบฅเบฑเบเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบกเบตเบเบฒเบเปเบซเบผเบเบซเบผเบฒเบเบเบตเปเบชเบธเบ.
เปเบเบทเปเบญเบซเบผเบธเบเบเปเบญเบเบเบฒเบเปเบซเบผเบเปเบเบเบฒเบเบเปเปเบกเบนเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบฝเบเบชเบฐเบเบดเบเบเบตเปเบเบฐเปเบญเบเบเบฑเบเบเบถเบเปเบเบปเปเบฒเบเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบกเบตเบชเบฝเบเปเบฅเบฐเปเบซเบฅเบเบซเบผเบฒเบเบเบตเปเบชเบธเบเปเบเบซเบฒเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ (เบเบปเบงเบขเปเบฒเบ, เบเบฒเบ. task
ะฒ task_archive
).
เบงเบฝเบเบเบฒเบเบเบตเปเปเบกเปเบเบชเบฑเบเบชเบปเบเปเบเบเบเปเบฒเบเบงเบเบเบฐเบซเบเบฒเบเปเบซเบเปเบเบญเบเบเบฒเบเบเบปเบงเบเบฑเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบฐเบฅเบฒเบ: เบเบฝเบเปเบเปเบเปเบฒเบเปเบเบงเบเบฒเบ task
ะฒ task_archive
เปเบกเปเบเบเปเปเบเบฝเบเบเป, เบเปเบญเบเบซเบเปเบฒเบเบฑเปเบเบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบฎเบฑเบเบเบฝเบงเบเบฑเบเบเบฑเบ recursively เบเบฑเบเบซเบกเบปเบเบเบตเปเบญเปเบฒเบเบญเบตเบ task
เปเบเบฐ.
เบเปเบญเบเบเบฐเบชเบฐเปเบเบเบเบปเบงเบขเปเบฒเบ
เปเบซเปเปเบงเบปเปเบฒเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบถเบเบเบฑเบเบเบถเบเบเบฒเบเบเบฒเบเบฐเบฅเบฒเบ Flights
. Postgres เบเบฐเบเปเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบฎเบฑเบเปเบเบฑเปเบเบเบตเป: เบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบฅเบถเบเบเบฑเบเบเบถเบเบเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเบฒเบเบญเปเบฒเบเบญเบตเบเบเบฑเบเบซเบกเบปเบ, เปเบฅเบฐเบญเบทเปเบเป recursively เบฅเบปเบเปเบเบซเบฒเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบเปเปเปเบเปเบญเปเบฒเบเบญเบตเบเปเบเบเปเบ.
เปเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบขเบนเปเบเบตเป Flights
refersเบฒเบเปเบเบดเบ Ticket_flights
, เปเบฅเบฐโเบเปเบฝเบงโเบเบฑเบโเบเบฒเบ - Boarding_passes
.
เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบถเบเบกเบฑเบเบขเบนเปเปเบเบเปเบฒเบชเบฑเปเบเบเบตเป:
- เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเบเปเบฒเบซเบผเบฑเบ (PK) เบเบญเบเปเบเบงเปเบ
Ticket_flights
, เปเบเบดเปเบเบซเบกเบฒเบเปเบเบดเบเปเบเบงเบเบตเปเบเบฐเบเบทเบเบฅเบถเบเบญเบญเบเปเบFlights
. - เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบเปเบเบง PK
Boarding_passes
, เปเบเบดเปเบเบซเบกเบฒเบเปเบเบดเบTicket_flights
. - เบเบงเบเปเบฎเบปเบฒเบฅเบถเบเปเบเบงเปเบเบ PK เบเบฒเบเบเบฑเปเบเบเบญเบ 2 เปเบเบเบฒเบเบฐเบฅเบฒเบ
Boarding_passes
. - เบฅเบถเบเบชเบฒเบเปเบเบ PK เบเบฒเบเบเบฑเปเบเบเบญเบ 1 เปเบ
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'
เปเบฅเปเบเบเบฒเบ console
เบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบ
$ 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
- เปเบชเบฑเปเบเบเบฒเบเปเบเบซเบฒเปเบเบฅเป config;--table
- เบเบฒเบเบฐเบฅเบฒเบเบเบตเปเปเบเบปเปเบฒเบเปเบญเบเบเบฒเบเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฐเบเบณ;--ids
โ เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบ id เปเบเบเบเปเบงเบเปเบเบทเปเบญเบเปเบฒเบเบเบธเบ, เบเบปเบงเบขเปเบฒเบ,1,2,3
(เบเบฒเบฅเบฒเบกเบดเปเบเบตเบเบฒเบเปเบฅเบทเบญเบ);--log_path
โ เปเบชเบฑเปเบโเบเบฒเบโเปเบโเบซเบฒโเปเบโเปเบเบตโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบเบฑเบโเบเบถเบ (เบเบปเบงโเบเปเบฒโเบเบปเบโเบเบฒเบโเบเบฒเบโเปเบฅเบทเบญเบโ, เปเบเบโเปเบโเบเบญเบโเบเบปเปเบ โ เปเบเบโเปเบเบตโเปเบฎเบทเบญเบโ)โ;--log_level
- เบฅเบฐเบเบฑเบเบเบฒเบเบเบฑเบเบเบถเบ (เบเบฒเบฅเบฒเบกเบดเปเบเบตเบเบฒเบเปเบฅเบทเบญเบ, เบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบเปเบกเปเบ INFO).
เบเบปเบงเบขเปเบฒเบเบเปเบฒเบชเบฑเปเบ
เบเบฒเบเปเบเบฑเบเบเบฒเบเบฐเบฅเบฒเบ
เบซเบเปเบฒเบเบตเปเบเบปเปเบเบเปเบเบญเบเบเบปเบเบเบฐเปเบซเบเบเปเบกเปเบเบเบฒเบเปเบเบฑเบเบเปเปเบกเบนเบ, i.e. เบเบฒเบเปเบญเบเปเบเบงเบเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเบปเปเบเบเปเปเบเบซเบฒเบเบฒเบเบฐเบฅเบฒเบเปเบเบฑเบ (เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบเบฒเบเบฐเบฅเบฒเบ เบซเบเบฑเบเบชเบท ะฒ books_archive).
เบเบฒเบเบฅเบถเบเปเบเบเบเปเปเบกเบตเบเบฒเบเปเบเบฑเบเปเบงเปเบเบฑเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบ: เบชเปเบฒเบฅเบฑเบเบเบตเป, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเปเบฒเบเบปเบเบเบฒเบฅเบฒเบกเบดเปเบเบตเปเบ 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')]}}
เบเบญเบเบซเบฒเบเบฒเบเบญเปเบฒเบเบญเบตเบเปเบเบดเบเบชเบฐเบเบฃเบดเบเบเบตเปเบกเบตเบฅเบฐเบซเบฑเบเบซเบผเบฑเบเบเบตเปเบฅเบฐเบเบธเปเบงเป
เบเบฑเบเบเบฑเบเปเบเบทเปเบญเบเบญเบเบซเบฒเปเบเบงเปเบเบเบฒเบเบฐเบฅเบฒเบเบญเบทเปเบเบเบตเปเบญเปเบฒเบเบญเบตเบเปเบชเปเปเบเบงเบเปเบฒเบ Foreign Key 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'}]}}}
เบเบฒเบโเบเปเบฒโเปเบเปโเปเบโเบฅเบฐโเบซเบฑเบโ
เบเบญเบเปเบซเบเบทเบญเบเบฒเบเบเบฒเบเปเบฅเปเบเบกเบฑเบเบขเบนเปเปเบ console, เบซเปเบญเบเบชเบฐเบซเบกเบธเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเปเบเบฅเบฐเบซเบฑเบ Python. เบเบปเบงเบขเปเบฒเบเบเบญเบเบเบฒเบเปเบเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเบฒเบเปเบเปเบเบญเบ 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