ืืืื ืื ื ืจืืฆื ืืืฆืื ืืคื ื ืงืืจืื Habr ืืื ืขืืจ ืฉื ืืชื ื-Python ืืขืืืื ืขื ืชืืืช ืืืืื ื- PostgreSQL DBMS.
ื-API ืฉื ืืื ืืฉืืจืืช ืคืฉืื ืืืืจืื ืืฉืืืฉ ืฉืืืืช:
- archive_table - ืืจืืืื/ืืืืงืช ืฉืืจืืช ืจืงืืจืกืืืืช ืขื ืืคืชืืืช ืจืืฉืืื ืฉืฆืืื ื
- get_table_references - ืืคืฉ ืชืืืช ืืืืื (ืืฆืื ืืืืืืช ืฉืืืืื ืืคื ื ืืืืื ืฉืฆืืื ืืืื ืืืคื ืื ืืืื)
- get_rows_references - ืืคืฉ ืฉืืจืืช ืืืืืืืช ืืืจืืช ืืืชืืืืกืืช ืืฉืืจืืช ืฉืฆืืื ื ืืืืื ืืจืฆืืื
ืคืจืืืกืืืจืื
ืฉืื ืืืื ืืืจืืื, ืื ื ืืคืชื ืืฆืืืช CRM ืืื ืืื ืืืืืืืช ืืฉืื ืชืืืช ืืืืืงืืืง.
ืืกื ืื ืชืื ืื ืืจืืฉื ืฉื ืืขืจืืช ื-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 = false).
ืคืจืืืจืื ื ืืจืฉืื - config_path, table ืืืืืื.
ืืืืจ ืืืฉืงื, ืืจืฉืืืืช ืืืืืงื ืืืืคื ืจืงืืจืกืืื 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