PgGraph - eszköz tĂĄblĂĄzatok fĂŒggƑsĂ©geinek archivĂĄlĂĄsĂĄra Ă©s keresĂ©sĂ©re PostgreSQL-ben

PgGraph - eszköz tĂĄblĂĄzatok fĂŒggƑsĂ©geinek archivĂĄlĂĄsĂĄra Ă©s keresĂ©sĂ©re PostgreSQL-ben
Ma ma szeretnĂ©m bemutatni a Habr olvasĂłinak egy Python nyelven kĂ©szĂŒlt eszközt, amely a PostgreSQL adatbĂĄzisok tĂĄblĂĄinak fĂŒggƑsĂ©geivel foglalkozik.

Az eszköz API-ja egyszerƱ, Ă©s hĂĄrom mĂłdszerbƑl ĂĄll:

  • archive_table — rekurzĂ­v archĂ­vĂĄlĂĄs/törlĂ©s a megadott elsƑdleges kulcsokkal rendelkezƑ sorokbĂłl
  • get_table_references — tĂĄblĂĄzatok fĂŒggƑsĂ©geinek keresĂ©se (megjelenĂ­ti azokat a tĂĄblĂĄzatokat, amelyek hivatkoznak a megadottra, valamint azokat, amelyek hivatkoznak rĂĄ)
  • get_rows_references — keresĂ©s mĂĄs tĂĄblĂĄzatokban, amelyek hivatkoznak a megadott tĂĄblĂĄzatban szereplƑ adott sorokra

Håttér

A nevem Oleg Borzov, CRM fejlesztƑ vagyok a jelzĂĄloghitel-kezelƑ csapatban a DomkliknĂ©l.

CRM rendszerĂŒnk fƑ adatbĂĄzisa az egyik legnagyobb a cĂ©g ajĂĄnlatain belĂŒl. Ez a legöregebb is: mĂĄr a projekt megkezdĂ©sĂ©nĂ©l lĂ©trejött, amikor a fĂĄk mĂ©g nagyok voltak, a Domklik egy startup, Ă©s a divatos, Python alapĂș aszinkron keretrendszer helyett egy hatalmas monolit futott PHP-n.

A PHP-rĂłl Pythonra valĂł ĂĄtĂĄllĂĄs nagyon hosszĂș folyamat volt, ami megkövetelte mindkĂ©t rendszer egyidejƱ tĂĄmogatĂĄsĂĄt, ami befolyĂĄsolta az adatbĂĄzis tervezĂ©sĂ©t.

Ennek eredmĂ©nyekĂ©nt egy olyan adatbĂĄzist kaptunk, amely rengeteg erƑsen összekapcsolt Ă©s hatalmas mĂ©retƱ tĂĄblĂĄbĂłl ĂĄll, kĂŒlönbözƑ tĂ­pusĂș lekĂ©rdezĂ©sekhez rengeteg indexszel. Mindez negatĂ­van hat az adatbĂĄzis teljesĂ­tmĂ©nyĂ©re: a nagy tĂĄblĂĄk Ă©s a sok összefĂŒggĂ©s miatt folyamatosan nƑ a lekĂ©rdezĂ©sek összetettsĂ©ge, ami kĂŒlönösen kritikus a legnagyobb terhelĂ©s alatt ĂĄllĂł tĂĄblĂĄk esetĂ©ben.

Az adatbĂĄzis terhelĂ©sĂ©nek csökkentĂ©se Ă©rdekĂ©ben Ășgy döntöttĂŒnk, hogy Ă­runk egy szkriptet, amely naponta, cron idƑzĂ­tĂ©ssel ĂĄthelyezi a rĂ©gi bejegyzĂ©seket a legnagyobb Ă©s legnagyobb terhelĂ©sƱ tĂĄblĂĄkbĂłl archĂ­v tĂĄblĂĄkba (pĂ©ldĂĄul a task be. task_archive).

Ez a feladat bonyolultabb a tĂĄblĂĄk közötti sok kapcsolat miatt: csupĂĄn ĂĄthelyezni a sorokat a task be. task_archive nem elegendƑ, elƑbb ugyanezt rekurzĂ­van el kell vĂ©gezni minden hivatkozĂłval rendelkezƑ task tĂĄblĂĄn.

Megmutatom egy példa segítségével a postgrespro.ru oldalról szårmazó bemutató adatbåzisra:

PgGraph - eszköz tĂĄblĂĄzatok fĂŒggƑsĂ©geinek archivĂĄlĂĄsĂĄra Ă©s keresĂ©sĂ©re PostgreSQL-ben
TegyĂŒk fel, hogy törölni kell a bejegyzĂ©seket a Flights. Ez nem lesz lehetsĂ©ges a Postgres szĂĄmĂĄra: elƑször is a hivatkozĂł tĂĄblĂĄkbĂłl kell törölni a bejegyzĂ©seket, Ă©s ezt rekurzĂ­van kell folytatni a hivatkozott tĂĄblĂĄkig, amelyeket senki sem hivatkozott.

Példånkban hivatkozik a Flights Ticket_flights -ra, és arra hivatkozik aBoarding_passes Ezért így kell törölni:.

Megkapjuk az elsƑdleges kulcsok (Primary Keys, PK) Ă©rtĂ©keit a

  1. , amelyek hivatkoznak a törlendƑ sorokra a -ra, Ă©s arra hivatkozik aMegkapjuk a PK sorait. Flights.
  2. Megkapjuk a törlendƑ sorok PK-jĂ©t. EzĂ©rt Ă­gy kell törölni:, amelyek a -ra, Ă©s arra hivatkozik a.
  3. Sorok eltåvolítåsa PK alapjån a 2. pontból a tåblåzatban Ezért így kell törölni:.
  4. Sorok eltåvolítåsa PK alapjån az 1. pontban -ra, és arra hivatkozik a.
  5. Sorok eltĂĄvolĂ­tĂĄsa a Flights.

VĂ©gĂŒl a PgGraph nevƱ eszköz szĂŒletett, amelyet nyĂ­lt forrĂĄskĂłdĂșvĂĄ akartunk tenni.

HasznĂĄlati ĂștmutatĂł

Az eszköz két hasznålati módot tåmogat:

  • HĂ­vĂĄs a parancssorbĂłl (pggraph 
).
  • HasznĂĄlat Python kĂłdban (osztĂĄly PgGraphApi).

Telepítés és beållítås

ElƑször telepĂ­teni kell az eszközt a Pypi-tĂĄrolĂłbĂłl:

pip3 install pggraph

Ezutån létre kell hozni egy config.ini fåjlt a helyi gépen az adatbåzis és a mentési szkriptek konfiguråciójåval:

[db]
host = localhost
port = 5432
user = postgres
password = postgres
dbname = postgres
schema = public ; Opcionålis paraméter, alapértelmezett értékkel megadva

[archive]  ; Ezt a rĂ©szt nem szĂŒksĂ©ges kitölteni, az alĂĄbbiak az alapĂ©rtelmezett Ă©rtĂ©kek
is_debug = false
chunk_size = 1000
max_depth = 20
to_archive = true
archive_suffix = 'archive'

FuttatĂĄs a konzolbĂłl

BeĂĄllĂ­tĂĄsok

$ pggraph -h
usage: pggraph action [-h] --table TABLE [--ids IDS] [--config_path CONFIG_PATH]
positional arguments:
  action        kötelezƑ tevĂ©kenysĂ©g: archive_table, get_table_references, get_rows_references

optional arguments:
  -h, --help                    ez a sĂșgĂł megjelenĂ­tĂ©se Ă©s kilĂ©pĂ©s
  --table TABLE                 tĂĄblĂĄzat neve
  --ids IDS                     elsƑdleges kulcs azonosítók, vesszƑvel elválasztva, pl. 1,2,3
  --config_path CONFIG_PATH     path a config.ini-hez
  --log_path LOG_PATH           naplĂł könyvtĂĄrĂĄnak elĂ©rĂ©si Ăștja
  --log_level LOG_LEVEL         naplĂłzĂĄsi szint (debug, info, error)

PozicionĂĄlis argumentumok:

  • action — szĂŒksĂ©ges tevĂ©kenysĂ©g: archive_table, get_table_references vagy get_rows_references.

Név szerint argumentumok:

  • --config_path — az elĂ©rĂ©si Ășt a konfigurĂĄciĂłs fĂĄjlhoz;
  • --table — a tĂĄblĂĄzat, amelyen a mƱveletet vĂ©gre szeretnĂ©d hajtani;
  • --ids — id-k listĂĄja vesszƑvel elvĂĄlasztva, pĂ©ldĂĄul, 1,2,3 (opcionĂĄlis paramĂ©ter);
  • --log_path — a naplĂłkhoz tartozĂł mappa elĂ©rĂ©si Ăștja (opcionĂĄlis paramĂ©ter, alapĂ©rtelmezett — a felhasznĂĄlĂłi mappa);
  • --log_level — naplĂłzĂĄsi szint (opcionĂĄlis paramĂ©ter, alapĂ©rtelmezett — INFO).

ParancsmintĂĄk

TĂĄbla archivĂĄlĂĄsa

Az eszköz fƑ funkciĂłja az adatok archivĂĄlĂĄsa, azaz a sorok ĂĄthelyezĂ©se a fƑ tĂĄblĂĄbĂłl az archĂ­vumba (pĂ©ldĂĄul a books be. books_archive).

Emellett tĂĄmogatja az archivĂĄlĂĄs nĂ©lkĂŒli törlĂ©st is: ehhez a config.ini fĂĄjlban a to_archive = false).

KötelezƑ paramĂ©terek — config_path, table Ă©s ids.

A futtatĂĄs utĂĄn rekurzĂ­van törlĂ©sre kerĂŒlnek a bejegyzĂ©sek ids a tĂĄblĂĄzatban table Ă©s minden hivatkozĂł tĂĄblĂĄban.

$ pggraph archive_table --config_path config.hw.local.ini --table flights --ids 1,2,3
2020-06-20 19:27:44 INFO: flights - KEZDÉS
2020-06-20 19:27:44 INFO: flights - kezdje el archive_recursive 3 sor (mélység=0)
2020-06-20 19:27:44 INFO:       KEZDÉS ARCHÍVUM HÍVÓ TÁBLÁK
2020-06-20 19:27:44 INFO:       ticket_flights - kezdje el archive_recursive 3 sor (mélység=1)
2020-06-20 19:27:44 INFO:               KEZDÉS ARCHÍVUM HÍVÓ TÁBLÁK
2020-06-20 19:27:44 INFO:               boarding_passes - kezdje el archive_recursive 3 sor (mélység=2)
2020-06-20 19:27:44 INFO:                       KEZDÉS ARCHÍVUM HÍVÓ TÁBLÁK
2020-06-20 19:27:44 INFO:                       ARCHÍVUM HÍVÓ TÁBLÁK VÉGE
2020-06-20 19:27:44 INFO:               boarding_passes - archive_by_ids 3 sor ticket_no, flight_id szerint
2020-06-20 19:27:44 INFO:               boarding_passes - kezdje el archive_recursive 3 sor (mélység=2)
2020-06-20 19:27:44 INFO:                       KEZDÉS ARCHÍVUM HÍVÓ TÁBLÁK
2020-06-20 19:27:44 INFO:                       ARCHÍVUM HÍVÓ TÁBLÁK VÉGE
2020-06-20 19:27:44 INFO:               boarding_passes - archive_by_ids 3 sor ticket_no, flight_id szerint
2020-06-20 19:27:44 INFO:               boarding_passes - kezdje el archive_recursive 3 sor (mélység=2)
2020-06-20 19:27:44 INFO:                       KEZDÉS ARCHÍVUM HÍVÓ TÁBLÁK
2020-06-20 19:27:44 INFO:                       ARCHÍVUM HÍVÓ TÁBLÁK VÉGE
2020-06-20 19:27:44 INFO:               boarding_passes - archive_by_ids 3 sor ticket_no, flight_id szerint
2020-06-20 19:27:44 INFO:               boarding_passes - kezdje el archive_recursive 3 sor (mélység=2)
2020-06-20 19:27:44 INFO:                       KEZDÉS ARCHÍVUM HÍVÓ TÁBLÁK
2020-06-20 19:27:44 INFO:                       ARCHÍVUM HÍVÓ TÁBLÁK VÉGE
2020-06-20 19:27:44 INFO:               boarding_passes - archive_by_ids 3 sor ticket_no, flight_id szerint
2020-06-20 19:27:44 INFO:               ARCHÍVUM HÍVÓ TÁBLÁK VÉGE
2020-06-20 19:27:44 INFO:       ticket_flights - archive_by_ids 3 sor ticket_no, flight_id szerint
2020-06-20 19:27:44 INFO:       ARCHÍVUM HÍVÓ TÁBLÁK VÉGE
2020-06-20 19:27:44 INFO: flights - archive_by_ids 3 sor id szerint
2020-06-20 19:27:44 INFO: flights - VÉGE

A megadott tĂĄbla fĂŒggƑsĂ©geinek keresĂ©se

FĂŒggƑsĂ©gek keresĂ©sĂ©re szolgĂĄlĂł funkciĂł a megadott tĂĄblĂĄhoz table. KötelezƑ paramĂ©terek — config_path Ă©s table.

A futtatĂĄs utĂĄn a kĂ©pernyƑre egy szĂłtĂĄr kerĂŒl kiĂ­rĂĄsra, ahol:

  • in_refs — a szĂłtar, amely a megadott tĂĄblĂĄra hivatkozĂł tĂĄblĂĄkat tartalmazza, ahol a kulcs — a tĂĄbla neve, az Ă©rtĂ©k — a KĂŒlsƑ Kulcs objektumok listĂĄja (pk_main — az elsƑdleges kulcs a fƑ tĂĄblĂĄban, pk_ref — az elsƑdleges kulcs a hivatkozĂł tĂĄblĂĄban, fk_ref — a megadott tĂĄblĂĄra hivatkozĂł kĂŒlsƑ kulcs neve);
  • out_refs — a tĂĄblĂĄk szĂłtĂĄra, amelyekre ez a tĂĄbla hivatkozik.

$ 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')]}}

HivatkozĂĄsok keresĂ©se a megadott elsƑdleges kulcsĂș sorokra

FĂŒggvĂ©ny sorok keresĂ©sĂ©re mĂĄs tĂĄblĂĄkban, amelyek kĂŒlsƑ kulcskĂ©nt hivatkoznak a sorokra ids a tĂĄblĂĄkban table. KötelezƑ paramĂ©terek — config_path, table Ă©s ids.

A program indĂ­tĂĄsakor egy szĂłtĂĄr jelenik meg a következƑ struktĂșrĂĄval:

{
	pk_id_1: {
		reffering_table_name_1: {
			foreign_key_1: [
				{row_pk_1: value, row_pk_2: value},
				...
			], 
			...
		},
		...
	},
	pk_id_2: {...},
	...
}

Példa hívåsra:

$ 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'}]}}}

HasznĂĄlat kĂłdban

A konzolon valĂł indĂ­tĂĄson kĂ­vĂŒl a könyvtĂĄrat Python kĂłdban is hasznĂĄlhatjuk. Az alĂĄbbiakban az interaktĂ­v iPython környezetben valĂł hĂ­vĂĄs pĂ©ldĂĄi lĂĄthatĂłk.

TĂĄbla archivĂĄlĂĄsa

>>> 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 - KEZDƐDIK
2020-06-20 23:12:08 INFO: flights - elkezd archive_recursive 2 sor (mélység=0)
2020-06-20 23:12:08 INFO: 	KEZDƐDIK AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA
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 - elkezd archive_recursive 30 sor (mélység=1)
2020-06-20 23:12:08 INFO: 		KEZDƐDIK AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA
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 sor ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no') szerint
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: 		TÖRLÉS boarding_passes by FK flight_id, ticket_no - 30 sor
2020-06-20 23:12:08 INFO: 		AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA VÉGEZTETT
2020-06-20 23:12:08 INFO: 	ticket_flights - archive_by_ids 30 sor 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: 	TÖRLÉS ticket_flights by flight_id, ticket_no - 30 sor
2020-06-20 23:12:08 DEBUG: 	INSERT INTO ticket_flights_archive - 30 sor
2020-06-20 23:12:08 INFO: 	ticket_flights - elkezd archive_recursive 30 sor (mélység=1)
2020-06-20 23:12:08 INFO: 		KEZDƐDIK AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA
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 sor ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no') szerint
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: 		TÖRLÉS boarding_passes by FK flight_id, ticket_no - 30 sor
2020-06-20 23:12:08 INFO: 		AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA VÉGEZTETT
2020-06-20 23:12:08 INFO: 	ticket_flights - archive_by_ids 30 sor 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: 	TÖRLÉS ticket_flights by flight_id, ticket_no - 30 sor
2020-06-20 23:12:08 DEBUG: 	INSERT INTO ticket_flights_archive - 30 sor
2020-06-20 23:12:08 INFO: 	ticket_flights - elkezd archive_recursive 30 sor (mélység=1)
2020-06-20 23:12:08 INFO: 		KEZDƐDIK AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA
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 sor ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no') szerint
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: 		TÖRLÉS boarding_passes by FK flight_id, ticket_no - 30 sor
2020-06-20 23:12:08 INFO: 		AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA VÉGEZTETT
2020-06-20 23:12:08 INFO: 	ticket_flights - archive_by_ids 30 sor 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: 	TÖRLÉS ticket_flights by flight_id, ticket_no - 30 sor
2020-06-20 23:12:08 DEBUG: 	INSERT INTO ticket_flights_archive - 30 sor
2020-06-20 23:12:08 INFO: 	ticket_flights - elkezd archive_recursive 3 sor (mélység=1)
2020-06-20 23:12:08 INFO: 		KEZDƐDIK AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA
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 sor ForeignKey(pk_main='flight_id, ticket_no', pk_ref='flight_id, ticket_no', fk_ref='flight_id, ticket_no') szerint
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: 		TÖRLÉS boarding_passes by FK flight_id, ticket_no - 3 sor
2020-06-20 23:12:08 INFO: 		AZ REFERENCIA TÁBLÁK ARCHIVÁLÁSA VÉGEZTETT
2020-06-20 23:12:08 INFO: 	ticket_flights - archive_by_ids 3 sor 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: 	TÖRLÉS ticket_flights by flight_id, ticket_no - 3 sor
2020-06-20 23:12:08 DEBUG: 	INSERT INTO ticket_flights_archive - 3 sor
2020-06-20 23:12:08 INFO: 	AZ ARCHIVÁLÁS REFERENCIA TÁBLÁK VÉGEZTEK
2020-06-20 23:12:08 INFO: flights - archive_by_ids 2 sor 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: TÖRLÉS flights by flight_id - 2 sor
2020-06-20 23:12:09 DEBUG: INSERT INTO flights_archive - 2 sor
2020-06-20 23:12:09 INFO: flights - ARCHIVÁLÁS VÉGE

A megadott tĂĄbla fĂŒggƑsĂ©geinek keresĂ©se

>>> 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')]}}

HivatkozĂĄsok keresĂ©se a megadott elsƑdleges kulcsĂș sorokra

>>> 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'}]}}}

A könyvtĂĄr forrĂĄskĂłdja elĂ©rhetƑ a GitHub MIT licenc alatt, valamint a következƑ tĂĄrolĂłban PyPI.

Örömmel vĂĄrom a megjegyzĂ©seket, hozzĂĄjĂĄrulĂĄsokat Ă©s javaslatokat.

A kĂ©rdĂ©sekre igyekszem vĂĄlaszolni a lehetƑsĂ©geim szerint itt Ă©s a tĂĄrolĂłban.

ForrĂĄs: habr.com

MegbĂ­zhatĂł hosting vĂĄsĂĄrlĂĄsa weboldalak szĂĄmĂĄra, DDoS vĂ©delemmel, VPS VDS szerverek. đŸ”„ MegbĂ­zhatĂł webtĂĄrhely vĂĄsĂĄrlĂĄsa DDoS vĂ©delemmel, VPS VDS szerverek | ProHoster