ααααααααααα»αα
αααααα αΆαα’αααα’αΆα Habr ααΆαα½αααΉαα§αααααααααΎααααΆαααααααααααα
αααα»α Python αααααΆααααααΎααΆαααΆαα½αααΆααΆα dependencies αα
αααα»α PostgreSQL DBMS α
API ααααα§αααααααααΎααααΆααααΊααΆαααα α αΎαααΆααα·ααΈααΈαααΆαα
- archive_table - ααΆααααααΆαα»α/αα»ααα½αααααααααααΆαα½αααΉαααααααααααΆααααααΆαα
- get_table_references - αααααααααΆαα’αΆααααααααααΆααααΆααΆα (ααΉααααα αΆαααΆααΆααααααααααααΆααΆααααααΆααααααΆαα αα·αα’αααααααααααΆ)
- get_rows_references - αααααααβαα½αβαααβαααα»αβααΆααΆαβαααααβαααβαααβαααβαα½αβαααβαααβααΆαβαααααΆααβαααα»αβααΆααΆαβαααβα ααβααΆαα
αααααα»αααααααααα·ααΆααααα
ααααααααααααα»αααΊ Oleg Borzov αααα»αααΆα’αααα’αα·αααααααα αααα»ααααα»α CRM αααααΆααα’ααααααααααααααααΆαααααα αΈαα·ααααααα Domklik α
ααΌαααααΆααα·ααααααααααΆαααααααααααα CRM ααααααΎαααΊααΆααααααα½αααααα ααααααα»ααα αααα»ααααα»αα αα»αα ααΆααααΆαααα»αα αα»αα αΆααααΆααααα½ααααα ααΆααΆααααα αΆααααα½ααα αααα»ααααααα·ααΈαααααααααααα αα ααααααααΎαααΎαα ααΌαααααΈα ααΊααΆααΆαα αΆααααααΎααα½α α αΎααααα½αα±ααααααΆααααααααΆαααΌα αα ααΎαααααααα Python asynchronous αααΌαααΆαααααα ααΆα monolith αααααα½ααα αααα»α 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)α
α§ααΆα αααααΆααααααααΆ
ααΆααααααΆαα»αααΆααΆα
αα»αααΆαααααΆααααααα§αααααααααΎααααΆααααΊααΆααααααΆαα»ααα·αααααα i.e. ααΆαααααααα½αααΈααΆααΆααααα ααΆααΆαααααααΆα (α§ααΆα ααα ααΈααΆααΆα ααααα Π² books_archive).
ααΆααα»ααααααααΆαααΆααααααΆαα»ααααα»ααααααααΆαααααααΌαααΆαααΆαααααααααα αααααΆαααααα αΆαααα’αααααααΌαααααααααΆαααΆαααααααα αααα»α 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')]}}
αααααααααα ααααΈααααα ααααα’αααααααααααΎααααααααααΆααααααΆαα
αα»αααΆαααΎααααΈααααααααα½αααααααα»αααΆααΆαααααααααααααααα
ααΎαα½ααααααΆαααα 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')]}}
αααααααααα ααααΈααααα ααααα’αααααααααααΎααααααααααΆααααααΆαα
>>> 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