PgGraph เป€เบ›เบฑเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเปเบฅเบฐเบŠเบญเบเบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ‚เบถเป‰เบ™เบเบฑเบš PostgreSQL

PgGraph เป€เบ›เบฑเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเปเบฅเบฐเบŠเบญเบเบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ‚เบถเป‰เบ™เบเบฑเบš PostgreSQL
เบกเบทเป‰เบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบœเบนเป‰เบญเปˆเบฒเบ™ Habr เบ”เป‰เบงเบเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ Python เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ dependencies เปƒเบ™ PostgreSQL DBMS.

API เบ‚เบญเบ‡เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบฒเบกเบงเบดเบ—เบตเบเบฒเบ™:

  • archive_table - เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบ„เบทเบ™ / เบฅเบถเบšโ€‹เปเบ–เบงโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบเบฐโ€‹เปเบˆโ€‹เบซเบผเบฑเบโ€‹เบ—เบตเปˆโ€‹เบฅเบฐโ€‹เบšเบธโ€‹เป„เบงเป‰โ€‹
  • get_table_references โ€” เบ„เบปเป‰เบ™โ€‹เบซเบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบญเบตเบ‡โ€‹เปƒเบชเปˆโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡ (เบˆเบฐโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เบญเป‰เบฒเบ‡โ€‹เบญเบตเบ‡โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เปเบฅเบฐโ€‹เบœเบนเป‰โ€‹เบ—เบตเปˆโ€‹เบญเป‰เบฒเบ‡โ€‹เป€เบ–เบดเบ‡โ€‹เบกเบฑเบ™โ€‹)
  • get_rows_references - เบ„เบปเป‰เบ™เบซเบฒเปเบ–เบงเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบญเป‰เบฒเบ‡เบญเบตเบ‡เปƒเบชเปˆเปเบ–เบงเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™

เบ›เบฐเบงเบฑเบ”เบชเบฒเบ”

เบ‚เป‰เบญเบเบŠเบทเปˆ Oleg Borzov, เบ‚เป‰เบญเบเป€เบ›เบฑเบ™เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ™เบ—เบตเบก CRM เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบชเบดเบ™เป€เบŠเบทเปˆเบญเบˆเปเบฒเบ™เบญเบ‡เปƒเบ™ Domklik.

เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš CRM เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ—เบตเปˆเปƒเบซเบเปˆเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เบญเบ‡เบšเปเบฅเบดเบชเบฑเบ”. เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ—เบตเปˆเป€เบเบปเปˆเบฒเปเบเปˆเบ—เบตเปˆเบชเบธเบ”: เบกเบฑเบ™เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเป‚เบ„เบ‡เบเบฒเบ™, เป€เบกเบทเปˆเบญเบ•เบปเป‰เบ™เป„เบกเป‰เปƒเบซเบเปˆ, Domklik เปเบกเปˆเบ™เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบฅเบฐเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ microservice เปƒเบ™เบเบญเบšเบ„เบปเบ™เบญเบฑเบšเป€เบ”เบ”: Python asynchronous เบกเบต monolith เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปƒเบ™ PHP.

เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบˆเบฒเบ PHP เป„เบ› Python เปเบกเปˆเบ™เบเบฒเบงเบซเบผเบฒเบเปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบžเป‰เบญเบกเบเบฑเบ™เบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡เบฅเบฐเบšเบปเบš, เป€เบŠเบดเปˆเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เบญเบญเบเปเบšเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเบนเบ‡เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ—เบตเปˆเบกเบตเบŠเปเปˆเบ‚เบญเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบชเปเบฒเบฅเบฑเบšเบ›เบฐเป€เบžเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบ—เบฒเบ‡เบฅเบปเบšเบ•เปเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™: เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปเบฅเบฐเบŠเปเปˆเบ‚เบญเบ‡เบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปเบกเปˆเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”.

เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบฝเบ™เบชเบฐเบ„เบดเบšเบ—เบตเปˆเบˆเบฐเป‚เบญเบ™เบšเบฑเบ™เบ—เบถเบเป€เบเบปเปˆเบฒเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบชเบฝเบ‡เปเบฅเบฐเป‚เบซเบฅเบ”เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เป„เบ›เบซเบฒเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบˆเบฒเบ. task ะฒ task_archive).

เบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เป‚เบ”เบเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡เบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡: เบžเบฝเบ‡เปเบ•เปˆเบเป‰เบฒเบเปเบ–เบงเบˆเบฒเบ task ะฒ task_archive เปเบกเปˆเบ™เบšเปเปˆเบžเบฝเบ‡เบžเป, เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš recursively เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบญเป‰เบฒเบ‡เบญเบตเบ‡ task เป‚เบ•เบฐ.

เบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡ เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒ postgrespro.ru:

PgGraph เป€เบ›เบฑเบ™เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเปเบฅเบฐเบŠเบญเบเบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ‚เบถเป‰เบ™เบเบฑเบš PostgreSQL
เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบถเบšเบšเบฑเบ™เบ—เบถเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ Flights. Postgres เบˆเบฐเบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰: เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฅเบถเบšเบšเบฑเบ™เบ—เบถเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบฅเบฐเบญเบทเปˆเบ™เป† recursively เบฅเบปเบ‡เป„เบ›เบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบญเป‰เบฒเบ‡เบญเบตเบ‡เป‚เบ”เบเปƒเบœ.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเบ—เบตเปˆ Flights refersเบฒเบเป€เบ–เบดเบ‡ 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'

เปเบฅเปˆเบ™เบˆเบฒเบ console

เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™

$ 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 - เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒ config;
  • --table - เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบฐเบ—เบณ;
  • --ids โ€” เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡ id เปเบเบเบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบˆเบธเบ”, เบ•เบปเบงเบขเปˆเบฒเบ‡, 1,2,3 (เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบ);
  • --log_path โ€” เป€เบชเบฑเป‰เบ™โ€‹เบ—เบฒเบ‡โ€‹เป„เบ›โ€‹เบซเบฒโ€‹เป‚เบŸโ€‹เป€เบ”เบตโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบ (เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹, เป‚เบ”เบโ€‹เปƒเบ™โ€‹เบ•เบญเบ™โ€‹เบ•เบปเป‰เบ™ โ€” เป‚เบŸเบ™โ€‹เป€เบ”เบตโ€‹เป€เบฎเบทเบญเบ™โ€‹)โ€‹;
  • --log_level - เบฅเบฐเบ”เบฑเบšเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบ (เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบ, เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™ INFO).

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡

เบเบฒเบ™เป€เบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เปเบกเปˆเบ™เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™, i.e. เบเบฒเบ™เป‚เบญเบ™เปเบ–เบงเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเป‰เบ™เบ•เปเป„เบ›เบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบเบฑเบš (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ เบซเบ™เบฑเบ‡เบชเบท ะฒ books_archive).

เบเบฒเบ™เบฅเบถเบšเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบเบฑเบšเป„เบงเป‰เบเบฑเบ‡เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™: เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปƒเบ™ config.ini. to_archive = เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡).

เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™ - config_path, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐ ids.

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹, เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เบเบฒเบ™โ€‹เบˆเบฐโ€‹เบ–เบทเบโ€‹เบฅเบปเบšโ€‹เบ„เบทเบ™โ€‹ 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'}]}}}

เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹

เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เปเบฅเปˆเบ™เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ console, เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบฑเบ” 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, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ P&IP.

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบเบดเบ™โ€‹เบ”เบตโ€‹เบเบฑเบšโ€‹เบ„เปเบฒโ€‹เบ„เบดเบ”โ€‹เป€เบซเบฑเบ™โ€‹, เบ„เปเบฒโ€‹เบซเบกเบฑเป‰เบ™โ€‹เบชเบฑเบ™โ€‹เบเบฒโ€‹เปเบฅเบฐโ€‹เบ„เปเบฒโ€‹เปเบ™เบฐโ€‹เบ™เปเบฒโ€‹.

เบ‚เป‰เบญเบเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบ•เบญเบšเบ„เปเบฒเบ–เบฒเบกเปƒเบซเป‰เบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบฅเบฐเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™