PgGraph ื”ื•ื ื›ืœื™ ืขื–ืจ ืœืืจื›ื™ื•ืŸ ื•ืžืฆื™ืืช ืชืœื•ืช ื‘ื˜ื‘ืœื” ื‘-PostgreSQL

PgGraph ื”ื•ื ื›ืœื™ ืขื–ืจ ืœืืจื›ื™ื•ืŸ ื•ืžืฆื™ืืช ืชืœื•ืช ื‘ื˜ื‘ืœื” ื‘-PostgreSQL
ื”ื™ื•ื ืื ื™ ืจื•ืฆื” ืœื”ืฆื™ื’ ื‘ืคื ื™ ืงื•ืจืื™ 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 ืฉื•ืœื—ื ื•ืช.

ืื ื™ ืื“ื’ื™ื ื‘ืขื–ืจืช ื“ื•ื’ืžื” ืžืกื“ ื ืชื•ื ื™ื ื”ื“ื’ืžื” ืžื”ืืชืจ postgrespro.ru:

PgGraph ื”ื•ื ื›ืœื™ ืขื–ืจ ืœืืจื›ื™ื•ืŸ ื•ืžืฆื™ืืช ืชืœื•ืช ื‘ื˜ื‘ืœื” ื‘-PostgreSQL
ื ื ื™ื— ืฉืขืœื™ื ื• ืœืžื—ื•ืง ืจืฉื•ืžื•ืช ืžื˜ื‘ืœื” Flights. Postgres ืœื ื™ืืคืฉืจ ืœื ื• ืœืขืฉื•ืช ื–ืืช ืกืชื ื›ืš: ืจืืฉื™ืช ืขืœื™ื ื• ืœืžื—ื•ืง ืจืฉื•ืžื•ืช ืžื›ืœ ื”ื˜ื‘ืœืื•ืช ื”ืžืชื™ื™ื—ืกื•ืช, ื•ื›ืŸ ื”ืœืื” ื‘ืื•ืคืŸ ืจืงื•ืจืกื™ื‘ื™ ืขื“ ืœื˜ื‘ืœืื•ืช ืฉืืฃ ืื—ื“ ืœื ืžืคื ื” ืืœื™ื”ืŸ.

ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื‘ Flights ืžืชื™ื™ื—ืก Ticket_flightsื•ืขืœื™ื” - Boarding_passes.

ืœื›ืŸ, ืขืœื™ืš ืœืžื—ื•ืง ืื•ืชื• ื‘ืกื“ืจ ื”ื–ื”:

  1. ืื ื• ืžืงื‘ืœื™ื ืืช ืขืจื›ื™ ื”ืžืคืชื—ื•ืช ื”ืจืืฉื™ื™ื (PK) ืฉืœ ืฉื•ืจื•ืช Ticket_flights, ื”ืžืชื™ื™ื—ืกื•ืช ืœืฉื•ืจื•ืช ืฉื™ืฉ ืœืžื—ื•ืง ื‘ื”ืŸ Flights.
  2. ืื ื—ื ื• ืžืงื‘ืœื™ื ืฉื•ืจื•ืช PK Boarding_passes, ื”ืžืชื™ื™ื—ืกื™ื ืœ Ticket_flights.
  3. ืื ื• ืžื•ื—ืงื™ื ืฉื•ืจื•ืช ืœืคื™ PK ืžืฉืœื‘ 2 ื‘ื˜ื‘ืœื” Boarding_passes.
  4. ืžื—ืง ืฉื•ืจื•ืช ืœืคื™ PK ืžืฉืœื‘ 1 ื‘ Ticket_flights.
  5. ื”ืกืจืช ืงื•ื•ื™ื ืž 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'}]}}}

ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืกืคืจื™ื™ื” ื–ืžื™ืŸ ื‘ื›ืชื•ื‘ืช GitHub ืชื—ืช ืจื™ืฉื™ื•ืŸ MIT, ื›ืžื• ื’ื ื‘ืžืื’ืจ PyPI.

ืืฉืžื— ืœื”ืขืจื•ืช, ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื•ื”ืฆืขื•ืช.

ืื ืกื” ืœืขื ื•ืช ืขืœ ืฉืืœื•ืช ื›ืžื™ื˜ื‘ ื™ื›ื•ืœืชื™ ื›ืืŸ ื•ื‘ืžืื’ืจ.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”