แแฆแแก แแแแแ Habr-แแก แแแแแฎแแแแแแก แฌแแ แแแแแแแแแ Python-แจแ แแแฌแแ แแแ แแ แแแ แแแ PostgreSQL DBMS-แจแ แชแฎแ แแแแแแก แแแแแแแแแแฃแแแแแแแแ แแฃแจแแแแแกแแแแก.
แแ แแแ แแแแก API แแแ แขแแแแ แแ แจแแแแแแ แกแแแ แแแแแแแกแแแ:
- แแ แฅแแแ_แชแฎแ แแแ - แ แแแฃแ แกแแฃแแ แแแแ แฅแแแแแ/แฌแแจแแ แ แแแแแ แแแแแแแแฃแแ แซแแ แแแแแ แแแแแแจแแแแ
- แแแแฆแแ_แแแแแแ_แแแแแจแแแแแแ - แแแซแแแแแ แแแแแแแแแแฃแแแแแแ แชแฎแ แแแแกแแแแก (แแแแฉแแแแแแก แชแฎแ แแแแแก, แ แแแแแแแช แแแแแแแแฃแแแ แแแแแแแแฃแแ แชแฎแ แแแแก แแแแ แแ แแแ, แแแแช แแแกแแ แแแฃแแแแแแก)
- get_rows_references - แแแซแแแแแ แ แแแแแ แกแฎแแ แชแฎแ แแแแแจแ, แ แแแแแแแช แแแฃแแแแแแแ แกแแกแฃแ แแแ แชแฎแ แแแจแ แแแแแแแแฃแ แกแขแ แแฅแแแแแก
แฌแแแแแกแขแแ แแ
แแ แแฅแแแ แแแแ แแแ แแแแ, แแ แแแ แแแแแแแแแ แ CRM แแฃแแแจแ แแแแแแแฃแ แ แกแแกแฎแแก แแแแแฏแแ แแแแกแแแแก Domklik-แจแ.
แฉแแแแ CRM แกแแกแขแแแแก แซแแ แแแแแ แแแแแชแแแแ แแแแ แแแชแฃแแแแแก แแแแแกแแแ แแกแแ แแ แ-แแ แแ แฃแแแแแกแแ แแแแแแแแแจแ. แแก แแกแแแ แแ แ-แแ แแ แฃแซแแแแแกแแ: แแก แแแแแฉแแแ แแ แแแฅแขแแก แแแฌแงแแแแกแแแแแแ, แ แแแแกแแช แฎแแแแ แแแแ แแงแ, Domklik แแงแ แกแขแแ แขแแแ แแ แแแแ แแกแแ แแแกแแก แแแชแแแแ แแแแฃแ Python-แแก แแกแแแฅแ แแแฃแ แฉแแ แฉแแแ แแงแ แฃแแแ แแแแแ แ แแแแแแแแ PHP-แจแ.
PHP-แแแ Python-แแ แแแแแกแแแ แซแแแแแ แแ แซแแแ แแงแ แแ แแแแแฎแแแแ แแ แแแ แกแแกแขแแแแก แแ แแแ แแฃแ แแฎแแ แแแญแแ แแก, แ แแแแช แแแแฅแแแแ แแแแแชแแแแ แแแแแก แแแแแแแแ.
แจแแแแแแ, แฉแแแ แแแแฅแแก แแแแแชแแแแ แแแแ แแแแ แ แแแแแแแแแ แฃแแฆแ แแกแแ แแแแแแจแแ แแแฃแแ แแ แฃแแแ แแแแแ แ แชแฎแ แแแแแแ, แแแแแฅแกแแแแก แกแแแ แแแแแ แกแฎแแแแแกแฎแแ แขแแแแก แแแแฎแแแแแแแกแแแแก. แแก แงแแแแแคแแ แ แฃแแ แงแแคแแแแ แแแฅแแแแแแก แแแแแชแแแแ แแแแแก แแฃแจแแแแแแ: แแแแ แชแฎแ แแแแแแกแ แแ แแแ แจแแ แแก แฃแ แแแแ แแแแแก แกแแแ แแแแแก แแแแ, แแแแฎแแแแแแแก แกแแ แแฃแแ แแฃแแแแแแ แแแ แแแแ, แ แแช แแแแกแแแฃแแ แแแแ แแแแจแแแแแแแแแแ แงแแแแแแ แแแขแแแ แแฃแแ แชแฎแ แแแแแแกแแแแก.
แแแแแชแแแแ แแแแแแ แแแขแแแ แแแแก แจแแกแแแชแแ แแแแแ, แฉแแแ แแแแแแฌแงแแแขแแ แแแแแแฌแแ แ แกแแ แแแขแ, แ แแแแแแช แแแแแแขแแแแ แซแแแ แฉแแแแฌแแ แแแก แงแแแแแแ แแแชแฃแแแแแแ แแ แแแขแแแ แแฃแแ แชแฎแ แแแแแแแแ แแแแ แฅแแแแแฃแ แชแฎแ แแแแแแ (แแแแแแแแแ, task
ะฒ task_archive
).
แแ แแแแชแแแแก แแ แแฃแแแแก แชแฎแ แแแแแก แจแแ แแก แฃแ แแแแ แแแแแก แแแแ แ แแแแแแแแ: แฃแแ แแแแ แแแแแแขแแแแ แ แแแแแ task
ะฒ task_archive
แกแแแแแ แแกแ แแ แแ แแก, แแแแแแแ แแฅแแแ แฃแแแ แแแแแแแแ แแแแแ แ แแแฃแ แกแแฃแแแ แงแแแแ แแ แแแแแแแแแ task
แแแแแแแแ.
แแแแแแกแขแ แแ แแแแก แแแแแแแแแ แแแแแแแแแ
แแแฅแแแ, แฉแแแ แฃแแแ แฌแแแจแแแแ แฉแแแแฌแแ แแแ แชแฎแ แแแแแแ Flights
. Postgres แแ แแแแแชแแแก แแแแก แฃแคแแแแแก แแฃแกแขแแ แแกแ: แฉแแแ แฏแแ แฃแแแ แฌแแแจแแแแ แฉแแแแฌแแ แแแ แงแแแแ แแแแแแแแแก แชแฎแ แแแแแแ แแ แ.แจ. แ แแแฃแ แกแแฃแแแ แฅแแแแแ แแ แชแฎแ แแแแแแแแ, แ แแแแแกแแช แแ แแแแ แแแแแ แแแแก.
แฉแแแแก แแแแแแแแจแ at Flights
แแฎแแแ Ticket_flights
แแ แแแกแแ - Boarding_passes
.
แแแแขแแ, แแฅแแแ แฃแแแ แฌแแจแแแแ แแแ แจแแแแแแ แแแแแแแแแแ แแแแ:
- แฉแแแ แแแฆแแแ แแฌแแ แแแแแแก แแแ แแแแแแ แแแกแแฆแแแแแแก (PK) แแแแจแแแแแแแแแก
Ticket_flights
, แ แแแแแแช แแฎแแแ แฌแแกแแจแแแแ แ แแแแแกFlights
. - แฉแแแ แแแฆแแแ PK แ แแแแแก
Boarding_passes
, แ แแแแแแแช แแฎแแแTicket_flights
. - แฉแแแ แแจแแแ แกแขแ แแฅแแแแแก PK-แแ แชแฎแ แแแแก แแ-2 แแแแแฏแแแแ
Boarding_passes
. - แฌแแจแแแแ แฎแแแแแ PK-แแ แแแ แแแแ แแแแแฏแแแแ
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
- แแซแแแแ แแแแแงแแคแแแ ID-แแแแก แกแแ, แแแแแแแแแ,1,2,3
(แกแฃแ แแแแแกแแแแแ แแแ แแแแขแ แ);--log_path
โ แแแแแแ แกแแฅแแฆแแแแแจแ แแฃแ แแแแแแแกแแแแก (แกแฃแ แแแแแกแแแแแ แแแ แแแแขแ แ, แแแแฃแแแกแฎแแแแแ - แแแแแแ แ แกแแฅแแฆแแแแ);--log_level
โ แจแแกแแแแก แแแแ (แกแฃแ แแแแแกแแแแแ แแแ แแแแขแ แ, แแแแฃแแแกแฎแแแแ แแ แแก INFO).
แแ แซแแแแแแก แแแแแแแแแแ
แชแฎแ แแแแก แแแแ แฅแแแแแ
แฃแขแแแแขแแก แซแแ แแแแแ แคแฃแแฅแชแแแ แแแแแชแแแแ แแแแ แฅแแแแแ, แ.แ. แ แแแแแแก แแแแแขแแแ แซแแ แแแแแ แชแฎแ แแแแแแ แกแแแ แฅแแแ แชแฎแ แแแจแ (แแแแแแแแแ, แชแฎแ แแแแแแ แฌแแแแแแ ะฒ แฌแแแแแแ_แแ แฅแแแ).
แแกแแแ แแฎแแ แแแญแแ แแแแ แฌแแจแแ แแแแ แฅแแแแแแก แแแ แแจแ: แแแแกแแแแแก แแฅแแแ แฃแแแ แแแแงแแแแ แแแ แแแแขแ แ config.ini-แจแ to_archive = แงแแแแ).
แกแแญแแ แ แแแ แแแแขแ แแแ - config_path, แชแฎแ แแแ แแ ID.
แแแจแแแแแก แจแแแแแ แฉแแแแฌแแ แแแ แ แแแฃแ แกแแฃแแแ แฌแแแจแแแแ 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'}]}}}
แแแแแงแแแแแ แแแแจแ
แแแ แแ แแแแกแแแจแ แแแกแ แแแจแแแแแกแ, แแแแแแแแแแแก แแแแแงแแแแแ แจแแกแแซแแแแแแแ แแแแแแแก แแแแจแ. 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