PgGraph αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž“αž·αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL

PgGraph αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž“αž·αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ PostgreSQL
αžαŸ’αž„αŸƒαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αž„αŸ’αž αžΆαž‰αž’αŸ’αž“αž€αž’αžΆαž“ 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 αžαž»αŸ”

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž‡αžΆαž˜αž½αž™αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αŸ” αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαžΆαž€αž›αŸ’αž”αž„αž–αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžš 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)αŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ

αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαžΆαžšαžΆαž„

αž˜αž»αžαž„αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‚αžΊαž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™ 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'}]}}}

αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž˜αžΆαž“αž“αŸ… GitHub αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽ MIT αž€αŸαžŠαžΌαž…αž‡αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ αž—αžΈαž—αžΈαž’αžΆαž™αŸ”.

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžšαžΈαž€αžšαžΆαž™αž…αŸ†αž–αŸ„αŸ‡αž˜αžαž·αž™αŸ„αž”αž›αŸ‹ αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž•αŸ’αžŠαž›αŸ‹αž™αŸ„αž”αž›αŸ‹αŸ”

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž†αŸ’αž›αžΎαž™αžŸαŸ†αžŽαž½αžšαž±αŸ’αž™αž’αžŸαŸ‹αž–αžΈαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž“αž·αž„αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹