Π‘Π΅Π³ΠΎΠ΄Π½Ρ Ρ Ρ
ΠΎΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌ Π₯Π°Π±ΡΠ° ΡΡΠΈΠ»ΠΈΡΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π½Π° Python, Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ ΡΠ°Π±Π»ΠΈΡ Π² Π‘Π£ΠΠ PostgreSQL.
API ΡΡΠΈΠ»ΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²:
- archive_table β ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½Π°Ρ Π°ΡΡ ΠΈΠ²Π°ΡΠΈΡ/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Primary Keys
- get_table_references β ΠΏΠΎΠΈΡΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ ΡΠ°Π±Π»ΠΈΡΡ (ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°Π½Π½Π°Ρ ΠΈ ΡΡΡΠ»Π°ΡΡΠΈΠ΅ΡΡ Π½Π° Π½Π΅Π΅)
- get_rows_references β ΠΏΠΎΠΈΡΠΊ ΡΡΡΠΎΠΊ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ°Π±Π»ΠΈΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π² Π½ΡΠΆΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅
ΠΡΠ΅Π΄ΡΡΡΠΎΡΠΈΡ
ΠΠ΅Π½Ρ Π·ΠΎΠ²ΡΡ ΠΠ»Π΅Π³ ΠΠΎΡΠ·ΠΎΠ², Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ CRM Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² ΠΈΠΏΠΎΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΡΠ΅Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΠΎΠΌΠΊΠ»ΠΈΠΊΠ΅.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΠ Π½Π°ΡΠ΅ΠΉ CRM-ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΊΡΡΠΏΠ½Π΅ΠΉΡΠΈΡ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΌΡ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ½Π° ΠΆΠ΅ ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ ΡΡΠ°ΡΡΡ : ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΠΏΡΠΈ ΡΠ°ΠΌΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΡΠ΅Π²ΡΡ Π±ΡΠ»ΠΈ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ, ΠΠΎΠΌΠΊΠ»ΠΈΠΊ β ΡΡΠ°ΡΡΠ°ΠΏΠΎΠΌ, Π° Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ° Π½Π° ΠΌΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΎΠΌ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅ Π±ΡΠ» ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΉ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ Π½Π° PHP.
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ Ρ PHP Π½Π° Python Π±ΡΠ» ΠΎΡΠ΅Π½Ρ Π΄ΠΎΠ»Π³ΠΈΠΌ ΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π» ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΎΠ±Π΅ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ, ΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΎΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΠ.
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π±Π°Π·Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΡΡ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌ ΡΠ°Π±Π»ΠΈΡ Ρ ΠΊΡΡΠ΅ΠΉ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΏΠΎΠ΄ ΡΠ°Π·Π½ΡΠ΅ ΡΠΈΠΏΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΡΡ ΡΡΠΎ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΠ: ΠΈΠ·-Π·Π° Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΊΡΡΠΈ ΡΠ²ΡΠ·Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ°ΡΡΠ΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π΄Π»Ρ ΡΠ°ΠΌΡΡ Π½Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡ.
ΠΠ»Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΠΠ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±Ρ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ ΠΏΠΎ ΠΊΡΠΎΠ½Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠ» ΡΡΠ°ΡΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· ΡΠ°ΠΌΡΡ
ΠΎΠ±ΡΠ΅ΠΌΠ½ΡΡ
ΠΈ Π½Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ
ΡΠ°Π±Π»ΠΈΡ Π² Π°ΡΡ
ΠΈΠ²Π½ΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· task
Π² task_archive
).
ΠΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ²ΡΠ·Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ: ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· task
Π² task_archive
Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΠ΄Π΅Π»Π°ΡΡ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΡΡΡΠ»Π°ΡΡΠΈΠΌΠΈΡΡ Π½Π° task
ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ.
ΠΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ Flights
. ΠΡΠΎΡΡΠΎ ΡΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Postgres Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ: ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· Π²ΡΠ΅Ρ
ΡΡΡΠ»Π°ΡΡΠΈΡ
ΡΡ ΡΠ°Π±Π»ΠΈΡ, ΠΈ ΡΠ°ΠΊ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π΄ΠΎ ΡΠ°Π±Π»ΠΈΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΡΡΡΠ»Π°Π΅ΡΡΡ.
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π° Flights
ΡΡΡΠ»Π°Π΅ΡΡΡ Ticket_flights
, Π° Π½Π° Π½Π΅Π΅ β Boarding_passes
.
ΠΠΎΡΡΠΎΠΌΡ ΡΠ΄Π°Π»ΡΡΡ Π½ΡΠΆΠ½ΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅:
- ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ (Primary Keys, PK) ΡΡΡΠΎΠΊ Π²
Ticket_flights
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π²Flights
. - ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ PK ΡΡΡΠΎΠΊ
Boarding_passes
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π°Ticket_flights
. - Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎ PK ΠΈΠ· ΠΏ.2 Π² ΡΠ°Π±Π»ΠΈΡΠ΅
Boarding_passes
. - Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΠΏΠΎ PK ΠΈΠ· ΠΏ.1 Π²
Ticket_flights
. - Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΠΈΠ·
Flights
.
Π ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ ΡΡΠΈΠ»ΠΈΡΠ° ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ PgGraph, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ open source.
ΠΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ
Π£ΡΠΈΠ»ΠΈΡΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
- ΠΡΠ·ΠΎΠ² ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ (
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).
ΠΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄
ΠΡΡ ΠΈΠ²Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΈΠ»ΠΈΡΡ β Π°ΡΡ ΠΈΠ²Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ , Ρ.Π΅. ΠΏΠ΅ΡΠ΅Π½ΠΎΡ ΡΡΡΠΎΠΊ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π² Π°ΡΡ ΠΈΠ²Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ books Π² books_archive).
Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π· Π°ΡΡ ΠΈΠ²Π°ΡΠΈΠΈ: Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ Π² config.ini ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ to_archive = false).
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ β config_path, table ΠΈ 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
β ΡΠ»ΠΎΠ²Π°ΡΡ ΡΡΡΠ»Π°ΡΡΠΈΡ ΡΡ ΡΠ°Π±Π»ΠΈΡ Π½Π° Π΄Π°Π½Π½ΡΡ, Π³Π΄Π΅ ΠΊΠ»ΡΡ β Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Foreign Key (pk_main
β ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅,pk_ref
β ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ Π² ΡΡΡΠ»Π°ΡΡΠ΅ΠΉΡΡ ΡΠ°Π±Π»ΠΈΡΠ΅,fk_ref
β Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΡΠ²Π»ΡΡΡΠ΅ΠΉΡΡ foreign key Π½Π° ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ);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')]}}
ΠΠΎΠΈΡΠΊ ΡΡΡΠ»ΠΎΠΊ Π½Π° ΡΡΡΠΎΠΊΠΈ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Primary Key
Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΡΡΠΎΠΊ Π² Π΄ΡΡΠ³ΠΈΡ
ΡΠ°Π±Π»ΠΈΡΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· 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'}]}}}
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ΄Π΅
ΠΠΎΠΌΠΈΠΌΠΎ Π·Π°ΠΏΡΡΠΊΠ° Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠΎΠ΄Π΅ 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')]}}
ΠΠΎΠΈΡΠΊ ΡΡΡΠ»ΠΎΠΊ Π½Π° ΡΡΡΠΎΠΊΠΈ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Primary Key
>>> 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'}]}}}
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π°
ΠΡΠ΄Ρ ΡΠ°Π΄ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌ, ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌ ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ.
ΠΠ° Π²ΠΎΠΏΡΠΎΡΡ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ ΠΎΡΠ²Π΅ΡΠΈΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π·Π΄Π΅ΡΡ ΠΈ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com