ΠΠ½Π΅Ρ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π½Π° ΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Habr ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Python Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ Π² Π‘Π£ΠΠ PostgreSQL.
API Π½Π° ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π΅ ΠΏΡΠΎΡΡ ΠΈ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°:
- Π°ΡΡ ΠΈΠ²Π½Π°_ΡΠ°Π±Π»ΠΈΡΠ° - ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅/ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΡΠ²ΠΈΡΠ½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅
- get_table_references β ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π·Π° ΡΠ°Π±Π»ΠΈΡΠ° (ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΊΡΠΌ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΠΈ ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Ρ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ°Ρ)
- get_rows_references - ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ Π² Π΄ΡΡΠ³ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ°Ρ ΠΊΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Π² ΠΆΠ΅Π»Π°Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°
ΠΏΡΠ°ΠΈΡΡΠΎΡΠΈΡ
ΠΠ°Π·Π²Π°ΠΌ ΡΠ΅ ΠΠ»Π΅Π³ ΠΠΎΡΠ·ΠΎΠ², Π°Π· ΡΡΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² CRM Π΅ΠΊΠΈΠΏΠ° Π·Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠΈ ΠΏΠΎ ΠΈΠΏΠΎΡΠ΅ΡΠ½ΠΎ ΠΊΡΠ΅Π΄ΠΈΡΠΈΡΠ°Π½Π΅ Π² Domklik.
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π½Π° Π½Π°ΡΠ°ΡΠ° CRM ΡΠΈΡΡΠ΅ΠΌΠ° Π΅ Π΅Π΄Π½Π° ΠΎΡ Π½Π°ΠΉ-Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΠΏΠΎ ΠΎΠ±Π΅ΠΌ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π΅ ΠΈ Π΅Π΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-ΡΡΠ°ΡΠΈΡΠ΅: ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ ΠΏΡΠΈ ΡΠ°ΠΌΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΠ³Π°ΡΠΎ Π΄ΡΡΠ²Π΅ΡΠ°ΡΠ° Π±ΡΡ Π° Π³ΠΎΠ»Π΅ΠΌΠΈ, Domklik Π±Π΅ΡΠ΅ ΡΡΠ°ΡΡΡΠΏ ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³Π° Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½Π° Python Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΡΠ°ΠΌΠΊΠ° ΠΈΠΌΠ°ΡΠ΅ ΠΎΠ³ΡΠΎΠΌΠ΅Π½ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ Π² PHP.
ΠΡΠ΅Ρ ΠΎΠ΄ΡΡ ΠΎΡ PHP ΠΊΡΠΌ Python Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΠ»ΡΠ³ ΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠ΅ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π΄Π²Π΅ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΎΡΡΠ°Π·ΠΈ Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΠΈΠ»Π½ΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Ρ ΠΊΡΠΏ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π·Π°ΡΠ²ΠΊΠΈ. ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΠΎΡΡΠ°Π·ΡΠ²Π° Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ: ΠΏΠΎΡΠ°Π΄ΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΈ ΠΊΡΠΏ Π²ΡΡΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ , ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π·Π° Π½Π°ΠΉ-Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ.
ΠΠ° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»Ρ ΡΡΠ°ΡΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΎΡ Π½Π°ΠΉ-ΠΎΠ±Π΅ΠΌΠ½ΠΈΡΠ΅ ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ Π² Π°ΡΡ
ΠΈΠ²ΠΈΡΠ°Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡ task
Π² task_archive
).
Π’Π°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° ΡΠ΅ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π° ΠΎΡ Π³ΠΎΠ»Π΅ΠΌΠΈΡ Π±ΡΠΎΠΉ Π²ΡΡΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅: ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ΅ΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΎΡ task
Π² task_archive
Π½Π΅ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΡΡΠΎΡΠΎ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈ task
ΠΌΠ°ΡΠΈ.
Π©Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌ Ρ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠΈ ΠΎΡ ΡΠ°Π±Π»ΠΈΡΠ° Flights
. Postgres Π½ΡΠΌΠ° Π΄Π° Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΊΠ°: ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠΈ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΈ ΡΠ°ΠΊΠ° Π½Π°ΡΠ°ΡΡΠΊ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π΄ΠΎ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ ΠΎΡ Π½ΠΈΠΊΠΎΠ³ΠΎ.
Π Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ Flights
ΡΠ΅ ΠΎΡΠ½Π°ΡΡ 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'
Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΎΡ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ
$ 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
β ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ, ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΡ Π·Π°ΠΏΠ΅ΡΠ°ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,1,2,3
(Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ);--log_path
β ΠΏΡΡ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ β Π΄ΠΎΠΌΠ°ΡΠ½Π° ΠΏΠ°ΠΏΠΊΠ°);--log_level
β Π½ΠΈΠ²ΠΎ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ (Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π΅ INFO).
ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ
ΠΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π΅ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ, Ρ.Π΅. ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΊΡΠΌ Π°ΡΡ ΠΈΠ²Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΊΠ½ΠΈΠ³ΠΈ_Π°ΡΡ ΠΈΠ²).
ΠΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π±Π΅Π· Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅: Π·Π° ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π² config.ini to_archive = Π½Π΅Π²ΡΡΠ½ΠΎ).
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ - config_path, ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ.
Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΡΡΠΈΡΠΈ 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'}]}}}
Π£ΠΏΠΎΡΡΠ΅Π±Π° Π² ΠΊΠΎΠ΄Π°
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΉ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΊΠΎΠ΄ Π½Π° 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