PgGraph เช PostgreSQL เชฎเชพเช‚ เช•เซ‹เชทเซเชŸเช• เช…เชตเชฒเช‚เชฌเชจเชจเซ‡ เช†เชฐเซเช•เชพเช‡เชต เช•เชฐเชตเชพ เช…เชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡

PgGraph เช PostgreSQL เชฎเชพเช‚ เช•เซ‹เชทเซเชŸเช• เช…เชตเชฒเช‚เชฌเชจเชจเซ‡ เช†เชฐเซเช•เชพเช‡เชต เช•เชฐเชตเชพ เช…เชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡
เช†เชœเซ‡ เชนเซเช‚ เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชกเซ€เชฌเซ€เชเชฎเชเชธเชฎเชพเช‚ เชŸเซ‡เชฌเชฒ เชกเชฟเชชเซ‡เชจเซเชกเชจเซเชธเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชพเชฏเชฅเซ‹เชจเชฎเชพเช‚ เชฒเช–เซ‡เชฒเซ€ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เชธเชพเชฅเซ‡ เชนเซ‡เชฌเซเชฐ เชตเชพเชšเช•เซ‹เชจเซ‡ เชชเซเชฐเชธเซเชคเซเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚.

เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซเช‚ API เชธเชฐเชณ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชคเซเชฐเชฃ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡:

  • เช†เชฐเซเช•เชพเช‡เชต_เชŸเซ‡เชฌเชฒ - เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชชเซเชฐเชพเชฅเชฎเชฟเช• เช•เซ€ เชธเชพเชฅเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช—/เชชเช‚เช•เซเชคเชฟเช“ เช•เชพเชขเซ€ เชจเชพเช–เชตเซ€
  • เชฎเซ‡เชณเชตเซ‹_เช•เซ‹เชทเซเชŸเช•_เชธเช‚เชฆเชฐเซเชญ - เช•เซ‹เชทเซเชŸเช• เชฎเชพเชŸเซ‡ เช…เชตเชฒเช‚เชฌเชจ เชฎเชพเชŸเซ‡ เชถเซ‹เชงเซ‹ (เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชเช• เชฆเซเชตเชพเชฐเชพ เชธเช‚เชฆเชฐเซเชญเชฟเชค เช•เซ‹เชทเซเชŸเช•เซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเซ‡เชจเชพเชฐเชพเช“ เชฌเชคเชพเชตเชถเซ‡)
  • เชฎเซ‡เชณเชตเซ‹_เชชเช‚เช•เซเชคเชฟเช“_เชธเช‚เชฆเชฐเซเชญ - เช…เชจเซเชฏ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚ เชชเช‚เช•เซเชคเชฟเช“ เชฎเชพเชŸเซ‡ เชถเซ‹เชงเซ‹ เชœเซ‡ เช‡เชšเซเช›เชฟเชค เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชชเช‚เช•เซเชคเชฟเช“เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เช†เชชเซ‡ เช›เซ‡

เชชเซเชฐเชพเช—เซˆเชคเชฟเชนเชพเชธเชฟเช•

เชฎเชพเชฐเซเช‚ เชจเชพเชฎ เช“เชฒเซ‡เช— เชฌเซ‹เชฐเซเชเซ‹เชต เช›เซ‡, เชนเซเช‚ เชกเซ‹เชฎเช•เซเชฒเชฟเช•เชฎเชพเช‚ เชฎเซ‹เชฐเซเชŸเช—เซ‡เชœ เชงเชฟเชฐเชพเชฃ เชธเช‚เชšเชพเชฒเช•เซ‹ เชฎเชพเชŸเซ‡เชจเซ€ CRM เชŸเซ€เชฎเชฎเชพเช‚ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เช›เซเช‚.

เช…เชฎเชพเชฐเซ€ CRM เชธเชฟเชธเซเชŸเชฎเชจเซ‹ เชฎเซเช–เซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เช เช•เช‚เชชเชจเซ€เชฎเชพเช‚ เชตเซ‹เชฒเซเชฏเซเชฎเชจเซ€ เชฆเซเชฐเชทเซเชŸเชฟเช เชธเซŒเชฅเซ€ เชฎเซ‹เชŸเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡. เชคเซ‡ เชธเซŒเชฅเซ€ เชœเซ‚เชจเชพเชฎเชพเช‚เชจเซเช‚ เชเช• เชชเชฃ เช›เซ‡: เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เช–เซ‚เชฌ เชœ เชฒเซ‹เชจเซเชš เชธเชฎเชฏเซ‡ เชฆเซ‡เช–เชพเชฏเซ‹, เชœเซเชฏเชพเชฐเซ‡ เชตเซƒเช•เซเชทเซ‹ เชฎเซ‹เชŸเชพ เชนเชคเชพ, เชกเซ‹เชฎเช•เซเชฒเชฟเช• เชเช• เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชนเชคเซเช‚, เช…เชจเซ‡ เชซเซ‡เชถเชจเซ‡เชฌเชฒ เชชเชพเชฏเชฅเซ‹เชจ เช…เชธเซเชฎเซ‡เชณ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชชเชฐ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธเชจเซ‡ เชฌเชฆเชฒเซ‡ PHP เชฎเชพเช‚ เชเช• เชตเชฟเชถเชพเชณ เชฎเซ‹เชจเซ‹เชฒเชฟเชฅ เชนเชคเซเช‚.

PHP เชฅเซ€ Python เชธเซเชงเซ€เชจเซเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ เช˜เชฃเซเช‚ เชฒเชพเช‚เชฌเซ เชนเชคเซเช‚ เช…เชจเซ‡ เชฌเช‚เชจเซ‡ เชธเชฟเชธเซเชŸเชฎเชจเชพ เชเช• เชธเชพเชฅเซ‡ เชธเชฎเชฐเซเชฅเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชนเชคเซ€, เชœเซ‡เชฃเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ€ เชกเชฟเชเชพเช‡เชจเชจเซ‡ เช…เชธเชฐ เช•เชฐเซ€ เชนเชคเซ€.

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชตเชฟเชตเชฟเชง เชชเซเชฐเช•เชพเชฐเชจเซ€ เช•เซเชตเซ‡เชฐเซ€เช เชฎเชพเชŸเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธเชจเชพ เชธเชฎเซ‚เชน เชธเชพเชฅเซ‡ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เช…เชคเซเชฏเช‚เชค เช•เชจเซ‡เช•เซเชŸเซ‡เชก เช…เชจเซ‡ เชตเชฟเชถเชพเชณ เช•เซ‹เชทเซเชŸเช•เซ‹ เชงเชฐเชพเชตเชคเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡. เช† เชฌเชงเซเช‚ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเชพ เชชเซเชฐเชญเชพเชตเชจเซ‡ เชจเช•เชพเชฐเชพเชคเซเชฎเช• เชฐเซ€เชคเซ‡ เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡: เชฎเซ‹เชŸเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชตเชšเซเชšเซ‡เชจเชพ เชธเช‚เชฌเช‚เชงเซ‹เชจเชพ เชธเชฎเซ‚เชนเชจเซ‡ เชฒเซ€เชงเซ‡, เชชเซเชฐเชถเซเชจเซ‹เชจเซ€ เชœเชŸเชฟเชฒเชคเชพ เชธเชคเชค เชตเชงเซ€ เชฐเชนเซ€ เช›เซ‡, เชœเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชธเซŒเชฅเซ€ เชตเชงเซ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชฎเชพเชŸเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡.

เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐเชจเซ‹ เชญเชพเชฐ เช˜เชŸเชพเชกเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เชœเซ‡ เชœเซ‚เชจเชพ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชจเซ‡ เชธเซŒเชฅเซ€ เชตเชงเซ เชตเชฟเชถเชพเชณ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเชพ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚เชฅเซ€ เช†เชฐเซเช•เชพเช‡เชต เช•เชฐเซ‡เชฒเชพ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชถเซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชนเซ€เช‚เชฅเซ€ task ะฒ task_archive).

เช† เช•เชพเชฐเซเชฏ เช•เซ‹เชทเซเชŸเช•เซ‹ เชตเชšเซเชšเซ‡เชจเชพ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชธเช‚เชฌเช‚เชงเซ‹ เชฆเซเชตเชพเชฐเชพ เชœเชŸเชฟเชฒ เช›เซ‡: เชซเช•เซเชค เชชเช‚เช•เซเชคเชฟเช“เชฅเซ€ เช–เชธเซ‡เชกเซ‹ task ะฒ task_archive เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชจเชฅเซ€, เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชคเชฎเชพเชฐเซ‡ เชคเซ‡ เชฌเชงเชพ เชธเช‚เชฆเชฐเซเชญเซ‹ เชธเชพเชฅเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเซ€เชคเซ‡ เชคเซ‡ เชœ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ task เช•เซ‹เชทเซเชŸเช•เซ‹

เชนเซเช‚ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เชธเชพเชฅเซ‡ เชฆเชฐเซเชถเชพเชตเซ€เชถ เชธเชพเช‡เชŸ postgrespro.ru เชชเชฐเชฅเซ€ เชกเซ‡เชฎเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช:

PgGraph เช PostgreSQL เชฎเชพเช‚ เช•เซ‹เชทเซเชŸเช• เช…เชตเชฒเช‚เชฌเชจเชจเซ‡ เช†เชฐเซเช•เชพเช‡เชต เช•เชฐเชตเชพ เช…เชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡
เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช†เชชเชฃเซ‡ เชŸเซ‡เชฌเชฒเชฎเชพเช‚เชฅเซ€ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ Flights. เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ เช…เชฎเชจเซ‡ เช†เชจเซ€ เชœเซ‡เชฎ เชœ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชถเซ‡ เชจเชนเซ€เช‚: เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเชพ เชฌเชงเชพ เชธเช‚เชฆเชฐเซเชญ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚เชฅเซ€ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชœ เช•เซ‹เชˆเชจเชพ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชฆเชฐเซเชญเชฟเชค เชจ เชนเซ‹เชฏ เชคเซ‡เชตเชพ เช•เซ‹เชทเซเชŸเช•เซ‹ เชชเชฐ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเซ€เชคเซ‡ เชจเซ€เชšเซ‡ เชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ Flights เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡ Ticket_flights, เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ - Boarding_passes.

เชคเซ‡เชฅเซ€, เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เช† เช•เซเชฐเชฎเชฎเชพเช‚ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  1. เช…เชฎเชจเซ‡ เชชเช‚เช•เซเชคเชฟเช“เชจเซ€ เชชเซเชฐเชพเชฅเชฎเชฟเช• เช•เซ€ (PK) เช•เชฟเช‚เชฎเชคเซ‹ เชฎเชณเซ‡ เช›เซ‡ Ticket_flights, เชœเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชชเช‚เช•เซเชคเชฟเช“เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เช†เชชเซ‡ เช›เซ‡ Flights.
  2. เช…เชฎเชจเซ‡ PK เชชเช‚เช•เซเชคเชฟเช“ เชฎเชณเซ‡ เช›เซ‡ Boarding_passes, เชœเซ‡เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเซ‹ Ticket_flights.
  3. เช…เชฎเซ‡ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชชเช—เชฒเซเช‚ 2 เชฎเชพเช‚เชฅเซ€ PK เชฆเซเชตเชพเชฐเชพ เชชเช‚เช•เซเชคเชฟเช“ เช•เชพเชขเซ€ เชจเชพเช–เซ€เช เช›เซ€เช Boarding_passes.
  4. เชชเช—เชฒเซเช‚ 1 เชฎเชพเช‚ เชฅเซ€ PK เชฆเซเชตเชพเชฐเชพ เชฐเซ‡เช–เชพเช“ เช•เชพเชขเซ€ เชจเชพเช–เซ‹ 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 - เช…เชฒเซเชชเชตเชฟเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เช…เชฒเช— เช•เชฐเชพเชฏเซ‡เชฒ id เชจเซ€ เชธเซ‚เชšเชฟ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 1,2,3 (เชตเซˆเช•เชฒเซเชชเชฟเช• เชชเชฐเชฟเชฎเชพเชฃ);
  • --log_path โ€” เชฒเซ‹เช— เชฎเชพเชŸเซ‡ เชซเซ‹เชฒเซเชกเชฐเชจเซ‹ เชชเชพเชฅ (เชตเซˆเช•เชฒเซเชชเชฟเช• เชชเชฐเชฟเชฎเชพเชฃ, เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ โ€” เชนเซ‹เชฎ เชซเซ‹เชฒเซเชกเชฐ);
  • --log_level - เชฒเซ‹เช—เซ€เช‚เช— เชธเซเชคเชฐ (เชตเซˆเช•เชฒเซเชชเชฟเช• เชชเชฐเชฟเชฎเชพเชฃ, เชกเชฟเชซเซ‹เชฒเซเชŸ INFO เช›เซ‡).

เช†เชฆเซ‡เชถ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชเช• เชŸเซ‡เชฌเชฒ เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช—

เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏ เชกเซ‡เชŸเชพ เช†เชฐเซเช•เชพเช‡เชตเชฟเช‚เช— เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เชฎเซเช–เซเชฏ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เช†เชฐเซเช•เชพเช‡เชต เชŸเซ‡เชฌเชฒ เชชเชฐ เชชเช‚เช•เซเชคเชฟเช“ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเซ€ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เชชเซเชธเซเชคเช•เซ‹ ะฒ เชชเซเชธเซเชคเช•เซ‹_เช†เชฐเซเช•เชพเช‡เชต).

เช†เชฐเซเช•เชพเช‡เชต เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซเช‚ เชชเชฃ เชธเชฎเชฐเซเชฅเชจ เช›เซ‡: เช† เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ 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')]}}

เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชชเซเชฐเชพเชฅเชฎเชฟเช• เช•เซ€ เชธเชพเชฅเซ‡ เชถเชฌเซเชฆเชฎเชพเชณเชพเช“เชจเชพ เชธเช‚เชฆเชฐเซเชญเซ‹ เชถเซ‹เชงเชตเซ€

เช…เชจเซเชฏ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚ เชชเช‚เช•เซเชคเชฟเช“ เชถเซ‹เชงเชตเชพเชจเซเช‚ เช•เชพเชฐเซเชฏ เชœเซ‡ เชตเชฟเชฆเซ‡เชถเซ€ เช•เซ€ เชฆเซเชตเชพเชฐเชพ เชชเช‚เช•เซเชคเชฟเช“เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เช†เชชเซ‡ เช›เซ‡ 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'}]}}}

เชชเซเชธเซเชคเช•เชพเชฒเชฏเชจเซ‹ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก เช…เชนเซ€เช‚ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ GitHub MIT เชฒเชพเชฏเชธเชจเซเชธ เชนเซ‡เช เชณ, เชคเซ‡เชฎเชœ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชชเซ€.เชชเซ€.เชชเซ€..

เชฎเชจเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“, เชชเซเชฐเชคเชฟเชฌเชฆเซเชงเชคเชพเช“ เช…เชจเซ‡ เชธเซ‚เชšเชจเซ‹เชฎเชพเช‚ เช†เชจเช‚เชฆ เชฅเชถเซ‡.

เชนเซเช‚ เช…เชนเซ€เช‚ เช…เชจเซ‡ เชญเช‚เชกเชพเชฐเชฎเชพเช‚ เชฎเชพเชฐเซ€ เชถเซเชฐเซ‡เชทเซเช  เช•เซเชทเชฎเชคเชพ เชฎเซเชœเชฌ เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชœเชตเชพเชฌ เช†เชชเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชคเซเชจ เช•เชฐเซ€เชถ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹