PostgreSQL-เตฝ เดŸเต‡เดฌเดฟเตพ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เด†เตผเด•เตเด•เตˆเดตเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเดพเดฃเต PgGraph.

PostgreSQL-เตฝ เดŸเต‡เดฌเดฟเตพ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เด†เตผเด•เตเด•เตˆเดตเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเดพเดฃเต PgGraph.
PostgreSQL DBMS-เตฝ เดŸเต‡เดฌเดฟเตพ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดชเตˆเดคเตเดคเดฃเดฟเตฝ เดŽเดดเตเดคเดฟเดฏ เด’เดฐเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเดพเดฃเต เด‡เดจเตเดจเต เดžเดพเตป Habr เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เต เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดคเต.

เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเตเดŸเต† API เดฒเดณเดฟเดคเดตเตเด‚ เดฎเต‚เดจเตเดจเต เดฐเต€เดคเดฟเด•เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเดคเตเดฎเดพเดฃเต:

  • เด†เตผเด•เตเด•เตˆเดตเต_เดŸเต‡เดฌเดฟเตพ - เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดชเตเดฐเตˆเดฎเดฑเดฟ เด•เต€เด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเดฐเดฟเด•เตพ เด†เดตเตผเดคเตเดคเดจ เด†เตผเด•เตเด•เตˆเดตเดฟเด‚เด—เต/เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตฝ
  • get_table_references - เด’เดฐเต เดชเดŸเตเดŸเดฟเด•เดฏเตโ€Œเด•เตเด•เดพเดฏเตเดณเตเดณ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพเด•เตเด•เดพเดฏเดฟ เดคเดฟเดฐเดฏเตเด• (เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸเดตเตเด‚ เด…เดคเต เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจเดตเดฏเตเด‚ เดชเดฐเดพเดฎเตผเดถเดฟเดšเตเดš เดชเดŸเตเดŸเดฟเด•เด•เตพ เด•เดพเดฃเดฟเด•เตเด•เตเด‚)
  • เดฑเดซเดฑเตปเดธเตเด•เตพ_เดตเดฐเต‚ - เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต† เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดตเดฐเดฟเด•เตพ เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจ เดฎเดฑเตเดฑเต เดชเดŸเตเดŸเดฟเด•เด•เดณเดฟเดฒเต† เดตเดฐเดฟเด•เตพเด•เตเด•เดพเดฏเดฟ เดคเดฟเดฐเดฏเตเด•

เดšเดฐเดฟเดคเตเดฐเดพเดคเต€เดคเด•เดพเดฒเด‚

เดŽเดจเตเดฑเต† เดชเต‡เดฐเต เด’เดฒเต†เด—เต เดฌเต‹เตผเดธเต‹เดตเต, เดžเดพเตป เดกเต‹เด‚เด•เตเดฒเดฟเด•เตเด•เดฟเดฒเต† เดฎเต‹เตผเดŸเตเดŸเตเด—เต‡เดœเต เดฒเต†เตปเดกเดฟเด‚เด—เต เดฎเดพเดจเต‡เดœเตผเดฎเดพเตผเด•เตเด•เดพเดฏเตเดณเตเดณ CRM เดŸเต€เดฎเดฟเดฒเต† เด’เดฐเต เดกเต†เดตเดฒเดชเตเดชเดฑเดพเดฃเต.

เดžเด™เตเด™เดณเตเดŸเต† CRM เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดชเตเดฐเดงเดพเดจ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด•เดฎเตเดชเดจเดฟเดฏเดฟเดฒเต† เดตเต‹เดณเดฟเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เดตเดฒเดฟเดฏ เด’เดจเตเดจเดพเดฃเต. เด‡เดคเต เดเดฑเตเดฑเดตเตเด‚ เดชเดดเด•เตเด•เด‚ เดšเต†เดจเตเดจ เด’เดจเตเดจเดพเดฃเต: เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดธเดฎเดพเดฐเด‚เดญเดคเตเดคเดฟเตฝ เดคเดจเตเดจเต† เด‡เดคเต เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต, เดฎเดฐเด™เตเด™เตพ เดตเดฒเตเดคเดพเดฏเดฟเดฐเตเดจเตเดจเดชเตเดชเต‹เตพ, เดกเต‹เด‚เด•เตเดฒเดฟเด•เตเด•เต เด’เดฐเต เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดชเตเดชเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดซเดพเดทเดจเดฌเดฟเตพ เดชเตˆเดคเตเดคเตบ เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดฟเตฝ เด’เดฐเต เดฎเตˆเด•เตเดฐเต‹เดธเตผเดตเต€เดธเดฟเดจเต เดชเด•เดฐเด‚ เดชเดฟเดŽเดšเตเดšเตเดชเดฟเดฏเดฟเตฝ เด’เดฐเต เดตเดฒเดฟเดฏ เดฎเต‹เดฃเต‹เดฒเดฟเดคเตเดคเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต.

PHP-เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตˆเดคเตเดคเดฃเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฎเดพเดฑเตเดฑเด‚ เดตเดณเดฐเต† เดฆเตˆเตผเด˜เตเดฏเดฎเต‡เดฑเดฟเดฏเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดฐเดฃเตเดŸเต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต‡เดธเดฎเดฏเด‚ เดชเดฟเดจเตเดคเตเดฃ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด‡เดคเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดจเตเดฑเต† เดฐเต‚เดชเด•เตฝเดชเตเดชเดจเดฏเต† เดฌเดพเดงเดฟเดšเตเดšเต.

เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดตเตเดฏเดคเตเดฏเดธเตโ€Œเดค เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพเด•เตเด•เดพเดฏเตเดณเตเดณ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดธเต‚เดšเดฟเด•เด•เดณเตเดณเตเดณ, เดตเดณเดฐเต† เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตโ€Œเดคเดคเตเด‚ เดตเดฒเดฟเดฏ เดชเดŸเตเดŸเดฟเด•เด•เดณเตเดณเตเดณเดคเตเดฎเดพเดฏ เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดžเด™เตเด™เดณเตเดŸเต† เดชเด•เตเด•เดฒเตเดฃเตเดŸเต. เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดจเตเดฑเต† เดชเตเดฐเด•เดŸเดจเดคเตเดคเต† เดชเตเดฐเดคเดฟเด•เต‚เดฒเดฎเดพเดฏเดฟ เดฌเดพเดงเดฟเด•เตเด•เตเดจเตเดจเต: เดตเดฒเดฟเดฏ เดชเดŸเตเดŸเดฟเด•เด•เดณเตเด‚ เด…เดตเดฏเตเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฌเดจเตเดงเด™เตเด™เดณเตเด‚ เด•เดพเดฐเดฃเด‚, เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเดŸเต† เดธเด™เตเด•เต€เตผเดฃเตเดฃเดค เดจเดฟเดฐเดจเตเดคเดฐเด‚ เดตเตผเดฆเตเดงเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดฒเต‹เดกเต เดšเต†เดฏเตเดค เดชเดŸเตเดŸเดฟเด•เด•เตพเด•เตเด•เต เดจเดฟเตผเดฃเตเดฃเดพเดฏเด•เดฎเดพเดฃเต.

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต† เดฒเต‹เดกเต เด•เตเดฑเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดเดฑเตเดฑเดตเตเด‚ เดตเดฒเดฟเดฏเดคเตเด‚ เดฒเต‹เดกเตเดšเต†เดฏเตเดคเดคเตเดฎเดพเดฏ เดชเดŸเตเดŸเดฟเด•เด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด†เตผเด•เตเด•เตˆเดตเตเดšเต†เดฏเตโ€Œเดคเดตเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเดดเดฏ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจ เด’เดฐเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดŽเดดเตเดคเดพเตป เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เดคเดฟเตฝ เดจเดฟเดจเตเดจเต task ะฒ task_archive).

เดชเดŸเตเดŸเดฟเด•เด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดตเดฒเดฟเดฏ เดฌเดจเตเดงเด™เตเด™เดณเดพเตฝ เดˆ เดŸเดพเดธเตเด•เต เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฃเต: เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดฐเดฟเด•เตพ เดจเต€เด•เตเด•เตเด• task ะฒ task_archive เดฎเดคเดฟเดฏเดพเด•เดฟเดฒเตเดฒ, เด…เดคเดฟเดจเตเดฎเตเดฎเตเดชเต เดจเดฟเด™เตเด™เตพ เดŽเดฒเตเดฒเดพ เดฑเดซเดฑเตปเดธเตเด•เดณเตเดฎเดพเดฏเตเด‚ เด‡เดคเต เด†เดตเตผเดคเตเดคเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต task เดชเดŸเตเดŸเดฟเด•เด•เตพ.

เดžเดพเตป เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด•เตŠเดฃเตเดŸเต เดคเต†เดณเดฟเดฏเดฟเด•เตเด•เตเด‚ postgrespro.ru เดŽเดจเตเดจ เดธเตˆเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเต†เดฎเต‹ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต:

PostgreSQL-เตฝ เดŸเต‡เดฌเดฟเตพ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เด†เตผเด•เตเด•เตˆเดตเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเดพเดฃเต PgGraph.
เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดชเดฑเดฏเดพเด‚ Flights. เดชเต‹เดธเตเดฑเตเดฑเตโ€Œเด—เตเดฐเต‡เดธเต เดžเด™เตเด™เดณเต† เด‡เดคเต เดชเต‹เดฒเต† เดšเต†เดฏเตเดฏเดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เดฟเดฒเตเดฒ: เดžเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดŽเดฒเตเดฒเดพ เดฑเดซเดฑเตปเดธเดฟเด‚เด—เต เดŸเต‡เดฌเดฟเดณเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด…เด™เตเด™เดจเต† เด†เดฐเตเด‚ เดฑเดซเดฑเตปเดธเต เดšเต†เดฏเตเดฏเดพเดคเตเดค เดชเดŸเตเดŸเดฟเด•เด•เดณเดฟเดฒเต‡เด•เตเด•เต เด†เดตเตผเดคเตเดคเดฟเดšเตเดšเต เด‡เดฑเด™เตเด™เตเด•.

เดžเด™เตเด™เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ Flights เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจเต Ticket_flights, เด…เดตเดณเตเดŸเต† เดฎเต‡เตฝ - Boarding_passes.

เด…เดคเดฟเดจเดพเตฝ, เดˆ เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เดจเดฟเด™เตเด™เตพ เด‡เดคเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

  1. เดตเดฐเดฟเด•เดณเตเดŸเต† เดชเตเดฐเดพเดฅเดฎเดฟเด• เด•เต€เด•เตพ (เดชเดฟเด•เต†) เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดจเดฎเตเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเด‚ Ticket_flights, เด…เดคเดฟเตฝ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เต‡เดฃเตเดŸ เดตเดฐเดฟเด•เดณเต† เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจเต Flights.
  2. เดจเดฎเตเด•เตเด•เต เดชเดฟเด•เต† เดตเดฐเดฟเด•เตพ เดฒเดญเดฟเด•เตเด•เตเด‚ Boarding_passes, เดเดคเต เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจเต Ticket_flights.
  3. เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต† เด˜เดŸเตเดŸเด‚ 2 เตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เดชเดฟเด•เต† เดตเดดเดฟ เดตเดฐเดฟเด•เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต Boarding_passes.
  4. เด˜เดŸเตเดŸเด‚ 1-เตฝ เดจเดฟเดจเตเดจเต PK-เดฏเตเดŸเต† เดตเดฐเดฟเด•เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด• Ticket_flights.
  5. เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดฐเดฟเด•เตพ เดจเต€เด•เตเด•เด‚เดšเต†เดฏเตเดฏเตเดจเตเดจเต Flights.

เดซเดฒเด‚ PgGraph เดŽเดจเตเดจ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด†เดฏเดฟเดฐเตเดจเตเดจเต, เด…เดคเต เดžเด™เตเด™เตพ เด“เดชเตเดชเตบ เดธเต‹เดดเตเดธเต เด†เด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต.

เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚

เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เดฐเดฃเตเดŸเต เด‰เดชเดฏเต‹เด— เดฐเต€เดคเดฟเด•เดณเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต:

  • เด•เดฎเดพเตปเดกเต เดฒเตˆเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเด• (pggraph โ€ฆ).
  • เดชเตˆเดคเตเดคเตบ เด•เต‹เดกเดฟเดฒเต† เด‰เดชเดฏเต‹เด—เด‚ (เด•เตเดฒเดพเดธเต 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 = เดคเต†เดฑเตเดฑเต).

เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ - 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')]}}

เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดชเตเดฐเตˆเดฎเดฑเดฟ เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตโ€ŒเดŸเตเดฐเดฟเด‚เด—เตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฑเดซเดฑเตปเดธเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเต

เดซเต‹เดฑเดฟเตป เด•เต€ เดตเดดเดฟ เดตเดฐเดฟเด•เดณเต† เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจ เดฎเดฑเตเดฑเต เดชเดŸเตเดŸเดฟเด•เด•เดณเดฟเดฒเต† เดตเดฐเดฟเด•เตพ เดคเดฟเดฐเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ 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'}]}}}

เดฒเตˆเดฌเตเดฐเดฑเดฟ เดธเต‹เดดเตเดธเต เด•เต‹เดกเต เด‡เดตเดฟเดŸเต† เดฒเดญเตเดฏเดฎเดพเดฃเต เดธเดพเดฎเต‚เดนเดฟเด•เด‚ MIT เดฒเตˆเดธเตปเดธเดฟเดจเต เด•เต€เดดเดฟเดฒเตเด‚, เด…เดคเตเดชเต‹เดฒเต† เดคเดจเตเดจเต† เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเตเด‚ PYPI.

เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เตพ, เดชเตเดฐเดคเดฟเดฌเดฆเตเดงเดคเด•เตพ, เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดžเดพเตป เดธเดจเตเดคเต‹เดทเดฟเด•เตเด•เตเด‚.

เด‡เดตเดฟเดŸเต†เดฏเตเด‚ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเดฒเตเด‚ เดŽเดจเตเดฑเต† เด•เดดเดฟเดตเดฟเดจเตเดฑเต† เดชเดฐเดฎเดพเดตเดงเดฟ เดšเต‹เดฆเตเดฏเด™เตเด™เตพเด•เตเด•เต เด‰เดคเตเดคเดฐเด‚ เดจเตฝเด•เดพเตป เดžเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•