PgGraph PostgreSQL เจตเจฟเฉฑเจš เจธเจพเจฐเจฃเฉ€ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจฒเฉ‡เจ– เจ•เจฐเจจ เจ…เจคเฉ‡ เจฒเฉฑเจญเจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจนเฉˆ

PgGraph PostgreSQL เจตเจฟเฉฑเจš เจธเจพเจฐเจฃเฉ€ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจฒเฉ‡เจ– เจ•เจฐเจจ เจ…เจคเฉ‡ เจฒเฉฑเจญเจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจนเฉˆ
เจ…เฉฑเจœ เจฎเฉˆเจ‚ เจนเฉˆเจฌเจฐ เจชเจพเจ เจ•เจพเจ‚ เจจเฉ‚เฉฐ PostgreSQL DBMS เจตเจฟเฉฑเจš เจŸเฉ‡เจฌเจฒ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจชเจพเจˆเจฅเจจ เจตเจฟเฉฑเจš เจฒเจฟเจ–เฉ€ เจ‡เฉฑเจ• เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจจเจพเจฒ เจชเฉ‡เจธเจผ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚เฅค

เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเจพ API เจธเจงเจพเจฐเจจ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจคเจฟเฉฐเจจ เจคเจฐเฉ€เจ•เฉ‡ เจนเจจ:

  • เจชเฉเจฐเจพเจฒเฉ‡เจ–_เจธเจพเจฐเจฃเฉ€ - เจจเจฟเจธเจผเจšเจฟเจค เจชเฉเจฐเจพเจ‡เจฎเจฐเฉ€ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจฐเฉ€เจ•เจฐเจธเจฟเจต เจ†เจฐเจ•เจพเจˆเจตเจฟเฉฐเจ— / เจ•เจคเจพเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃเจพ
  • เจชเฉเจฐเจพเจชเจค_เจธเจพเจฐเจฃเฉ€_เจนเจตเจพเจฒเฉ‡ โ€” เจ‡เฉฑเจ• เจŸเฉ‡เจฌเจฒ เจฒเจˆ เจจเจฟเจฐเจญเจฐเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเฉ‹ (เจจเจฟเจฐเจงเจพเจฐเจค เจŸเฉ‡เจฌเจฒ เจ…เจคเฉ‡ เจ‡เจธ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉ‡เจฃ เจตเจพเจฒเฉ‡ เจฆเฉเจ†เจฐเจพ เจนเจตเจพเจฒเจพ เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพ)
  • เจชเฉเจฐเจพเจชเจค_เจ•เจคเจพเจฐเจพเจ‚_เจนเจตเจพเจฒเฉ‡ - เจนเฉ‹เจฐ เจธเจพเจฐเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ•เจคเจพเจฐเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเฉ‹ เจœเฉ‹ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจคเจพเจฐเจพเจ‚ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ

prehistory

เจฎเฉ‡เจฐเจพ เจจเจพเจฎ เจ“เจฒเฉ‡เจ— เจฌเฉ‹เจฐเจœเจผเฉ‹เจต เจนเฉˆ, เจฎเฉˆเจ‚ เจกเฉ‹เจฎเจ•เจฒเจฟเจ• เจตเจฟเฉฑเจš เจฎเฉŒเจฐเจ—เฉ‡เจœ เจ‰เจงเจพเจฐ เจชเฉเจฐเจฌเฉฐเจงเจ•เจพเจ‚ เจฒเจˆ 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 เจคเฉ‹เจ‚ เจชเฉ€เจ•เฉ‡ เจฆเฉเจ†เจฐเจพ เจ•เจคเจพเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ Boarding_passes.
  4. เจชเจ— 1 เจ‡เฉฐเจš เจคเฉ‹เจ‚ เจชเฉ€เจ•เฉ‡ เจฆเฉเจ†เจฐเจพ เจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ“ 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'}]}}}

เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก 'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเฉˆ GitHub MIT เจฒเจพเจ‡เจธเฉฐเจธ เจฆเฉ‡ เจคเจนเจฟเจค, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจชเฉ€เจ†เจˆเจชเฉ€เจ†เจˆ.

เจฎเฉˆเจจเฉ‚เฉฐ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚, เจชเฉเจฐเจคเฉ€เจฌเฉฑเจงเจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจธเฉเจเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€.

เจฎเฉˆเจ‚ เจ‡เฉฑเจฅเฉ‡ เจ…เจคเฉ‡ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ†เจชเจฃเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจ…เจจเฉเจธเจพเจฐ เจธเจตเจพเจฒเจพเจ‚ เจฆเฉ‡ เจœเจตเจพเจฌ เจฆเฉ‡เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจพเจ‚เจ—เจพเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹