์ค๋ ์ ๋ Habr ๋
์๋ค์๊ฒ PostgreSQL DBMS์์ ํ
์ด๋ธ ์ข
์์ฑ ์์
์ ์ํด Python์ผ๋ก ์์ฑ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
์ ํธ๋ฆฌํฐ์ API๋ ๊ฐ๋จํ๋ฉฐ ๋ค์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- archive_table - ์ง์ ๋ ๊ธฐ๋ณธ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ฌ๊ท์ ์ผ๋ก ๋ณด๊ด/์ญ์
- get_table_references โ ํ ์ด๋ธ์ ๋ํ ์ข ์์ฑ์ ๊ฒ์ํฉ๋๋ค(์ง์ ๋ ํ ์ด๋ธ๊ณผ ์ด๋ฅผ ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ด ํ์๋จ).
- get_rows_references - ์ํ๋ ํ ์ด๋ธ์ ์ง์ ๋ ํ์ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ํ ์ด๋ธ์ ํ์ ๊ฒ์ํฉ๋๋ค.
์ ์ฌ ์๋
์ ์ด๋ฆ์ Oleg Borzov์ด๊ณ Domklik์ ๋ชจ๊ธฐ์ง ๋์ถ ๊ด๋ฆฌ์๋ฅผ ์ํ CRM ํ์ ๊ฐ๋ฐ์์ ๋๋ค.
์ฐ๋ฆฌ CRM ์์คํ ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ฌ์์ ๊ฐ์ฅ ํฐ ๊ท๋ชจ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค ํ๋์ ๋๋ค. ์ด๊ฒ์ ๋ํ ๊ฐ์ฅ ์ค๋๋ ๊ฒ ์ค ํ๋์ ๋๋ค. ํ๋ก์ ํธ๊ฐ ์์๋ ๋ ๋ํ๋ฌ์ต๋๋ค. ๋๋ฌด๊ฐ ์ปธ์ ๋ Domklik์ ์คํํธ์ ์ด์๊ณ ์ธ๋ จ๋ Python ๋น๋๊ธฐ ํ๋ ์์ํฌ์ ๋ง์ดํฌ๋ก์๋น์ค ๋์ PHP์ ๊ฑฐ๋ํ ๋จ์ผ์ฒด๊ฐ ์์์ต๋๋ค.
PHP์์ Python์ผ๋ก์ ์ ํ์ ๋งค์ฐ ๊ธธ์๊ณ ๋ ์์คํ ์ ๋์ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ์ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋ค์ํ ์ ํ์ ์ฟผ๋ฆฌ์ ๋ํ ๋ง์ ์ธ๋ฑ์ค๋ฅผ ํฌํจํ๋ ๊ณ ๋๋ก ์ฐ๊ฒฐ๋๊ณ ๊ฑฐ๋ํ ํ ์ด๋ธ์ด ๋ง์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณด์ ํ๊ฒ ๋์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํฐ ํ ์ด๋ธ๊ณผ ํ ์ด๋ธ ์ฌ์ด์ ์๋ง์ ๊ด๊ณ๋ก ์ธํด ์ฟผ๋ฆฌ์ ๋ณต์ก์ฑ์ด ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์์ผ๋ฉฐ ์ด๋ ๊ฐ์ฅ ๋ง์ด ๋ก๋๋ ํ ์ด๋ธ์ ํนํ ์ค์ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก๋๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๋ฐฉ๋ํ๊ณ ๋ก๋๋ ํ
์ด๋ธ์ ์ค๋๋ ๋ ์ฝ๋๋ฅผ ๋ณด๊ด๋ ํ
์ด๋ธ(์: task
ะฒ task_archive
).
์ด ์์
์ ํ
์ด๋ธ ๊ฐ์ ๊ด๊ณ๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ๋ณต์กํฉ๋๋ค. task
ะฒ task_archive
์ถฉ๋ถํ์ง ์์ต๋๋ค. ๊ทธ ์ ์ ์ฐธ์กฐํ๋ ๋ชจ๋ ํญ๋ชฉ์ ๋ํด ๋์ผํ ์์
์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํด์ผ ํฉ๋๋ค. task
ํ
์ด๋ธ.
์์๋ฅผ ๋ค์ด ์ค๋ช
ํ๊ฒ ์ต๋๋ค
ํ
์ด๋ธ์์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Flights
. Postgres๋ ๊ทธ๋ฐ ์์ผ๋ก ์ด๋ฅผ ์ํํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ๋จผ์ ๋ชจ๋ ์ฐธ์กฐ ํ
์ด๋ธ์์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํด์ผ ํ๋ฉฐ, ๊ทธ๋ฐ ๋ค์ ๋๊ตฌ๋ ์ฐธ์กฐํ์ง ์๋ ํ
์ด๋ธ๊น์ง ๋ฐ๋ณต์ ์ผ๋ก ์ญ์ ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ์ ์์์๋ Flights
~์ ์ง์นญํ๋ค Ticket_flights
, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋
์๊ฒ- Boarding_passes
.
๋ฐ๋ผ์ ๋ค์ ์์๋ก ์ญ์ ํด์ผ ํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ ํ์ ๊ธฐ๋ณธ ํค(PK) ๊ฐ์ ์ป์ต๋๋ค.
Ticket_flights
, ์ญ์ ๋ ํ์ ๋ํ๋ ๋๋ค.Flights
. - PK ํ์ ์ป์ต๋๋ค.
Boarding_passes
, ์ด๋ ๋ค์์ ์ฐธ์กฐํฉ๋๋ค.Ticket_flights
. - ํ
์ด๋ธ์ 2๋จ๊ณ์์ PK๋ณ๋ก ํ์ ์ญ์ ํฉ๋๋ค.
Boarding_passes
. - 1๋จ๊ณ์์ PK๋ณ๋ก ๋ผ์ธ์ ์ญ์ ํฉ๋๋ค.
Ticket_flights
. - ๋ค์์์ ์ค ์ ๊ฑฐ
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, ํ ์ด๋ธ ๋ฐ ID.
์ถ์ ํ ๊ธฐ๋ก์ ๋ฐ๋ณต์ ์ผ๋ก ์ญ์ ๋ฉ๋๋ค. 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'}]}}}
์ฝ๋์์์ ์ฌ์ฉ๋ฒ
์ฝ์์์ ์คํํ๋ ๊ฒ ์ธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ 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'}]}}}
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค ์ฝ๋๋ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค.
๋๋ ์๊ฒฌ, ์ปค๋ฐ ๋ฐ ์ ์์ ๊ธฐ๊บผ์ด ๋ฐ์๋ค์ผ ๊ฒ์ ๋๋ค.
์ ๋ ์ฌ๊ธฐ์ ์ ์ฅ์์์ ์ต์ ์ ๋คํด ์ง๋ฌธ์ ๋ต๋ณํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค.
์ถ์ฒ : habr.com