notebookvb
This commit is contained in:
@@ -21,7 +21,7 @@ JMENA = "Vladimír"
|
||||
DATUM_NAROZENI = "1973-09-20"
|
||||
|
||||
POCET_ZNAKU_ATC = 7
|
||||
POCET_MESICU = 60
|
||||
POCET_MESICU =60
|
||||
|
||||
VYSTUP = Path(__file__).parent / "odpoved_lekovy_zaznam.xml"
|
||||
|
||||
|
||||
@@ -54,6 +54,8 @@ DDL_TABULKY = [
|
||||
"DROP TABLE IF EXISTS vydej",
|
||||
"DROP TABLE IF EXISTS predpis",
|
||||
"DROP TABLE IF EXISTS zprava",
|
||||
"DROP TABLE IF EXISTS predepisujici",
|
||||
"DROP TABLE IF EXISTS vydavajici",
|
||||
|
||||
# ── zprava ────────────────────────────────────────────────────────────────
|
||||
# zprava_odpoved_type + zprava_type:
|
||||
@@ -186,6 +188,50 @@ DDL_TABULKY = [
|
||||
INDEX idx_nazev (nazev)
|
||||
) ENGINE=InnoDB
|
||||
""",
|
||||
|
||||
# ── predepisujici ─────────────────────────────────────────────────────────
|
||||
# PredepisujiciSeznam > Predepisujici:
|
||||
# Lekar: Kod CHAR(36), Jmeno: Prijmeni(35), Jmena(24)
|
||||
# ICZ CHAR(8)?, ICP CHAR(8)?
|
||||
# PZS: Nazev(200), Adresa: NazevUlice, CisloPopisne, CisloOrientacni, NazevObce, PSC
|
||||
# Telefon(20)?
|
||||
# lekar_kod = predpis.kod_predepisujiciho
|
||||
"""
|
||||
CREATE TABLE predepisujici (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
lekar_kod CHAR(36) NOT NULL UNIQUE,
|
||||
prijmeni VARCHAR(35),
|
||||
jmena VARCHAR(24),
|
||||
icz CHAR(8),
|
||||
icp CHAR(8),
|
||||
pzs_nazev VARCHAR(200),
|
||||
ulice VARCHAR(150),
|
||||
mesto VARCHAR(100),
|
||||
psc CHAR(5),
|
||||
telefon VARCHAR(20),
|
||||
INDEX idx_icp (icp),
|
||||
INDEX idx_icz (icz)
|
||||
) ENGINE=InnoDB
|
||||
""",
|
||||
|
||||
# ── vydavajici ────────────────────────────────────────────────────────────
|
||||
# VydavajiciSeznam > Vydavajici:
|
||||
# Lekarnik: Kod CHAR(36), Jmeno: Prijmeni(35), Jmena(24)
|
||||
# PZS: Nazev(200), Telefon(20)?, Adresa: NazevUlice, CisloPopisne, CisloOrientacni, NazevObce, PSC
|
||||
# lekarnik_kod = vydej.kod_vydavajiciho
|
||||
"""
|
||||
CREATE TABLE vydavajici (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
lekarnik_kod CHAR(36) NOT NULL UNIQUE,
|
||||
prijmeni VARCHAR(35),
|
||||
jmena VARCHAR(24),
|
||||
pzs_nazev VARCHAR(200),
|
||||
ulice VARCHAR(150),
|
||||
mesto VARCHAR(100),
|
||||
psc CHAR(5),
|
||||
telefon VARCHAR(20)
|
||||
) ENGINE=InnoDB
|
||||
""",
|
||||
]
|
||||
|
||||
|
||||
@@ -199,6 +245,79 @@ def vytvor_schema(conn):
|
||||
print("Schema OK (5 tabulek smazano a vytvoreno znovu)")
|
||||
|
||||
|
||||
# ── parsovani predepisujicich a vydavajicich ─────────────────────────────────
|
||||
|
||||
def _parsuj_adresu(pzs_el):
|
||||
"""Ze elementu PZS vraci (ulice, mesto, psc)."""
|
||||
adr = pzs_el.find(f"{{{NS}}}Adresa") if pzs_el is not None else None
|
||||
if adr is None:
|
||||
return None, None, None
|
||||
ulice_parts = [
|
||||
t(adr, "NazevUlice") or "",
|
||||
t(adr, "CisloPopisne") or "",
|
||||
t(adr, "CisloOrientacni") or "",
|
||||
]
|
||||
ulice = " ".join(p for p in ulice_parts if p).strip() or None
|
||||
psc = t(adr, "PSC")
|
||||
if psc and len(psc) > 5:
|
||||
psc = psc[:5]
|
||||
return ulice, t(adr, "NazevObce"), psc
|
||||
|
||||
|
||||
def parsuj_predepisujici(doklad):
|
||||
"""Vraci seznam slovniku pro tabulku predepisujici."""
|
||||
seznam = []
|
||||
sez_el = doklad.find(f"{{{NS}}}PredepisujiciSeznam")
|
||||
if sez_el is None:
|
||||
return seznam
|
||||
for el in sez_el.findall(f"{{{NS}}}Predepisujici"):
|
||||
lekar = el.find(f"{{{NS}}}Lekar")
|
||||
if lekar is None:
|
||||
continue
|
||||
jmeno = lekar.find(f"{{{NS}}}Jmeno")
|
||||
pzs = el.find(f"{{{NS}}}PZS")
|
||||
ulice, mesto, psc = _parsuj_adresu(pzs)
|
||||
seznam.append(dict(
|
||||
lekar_kod = t(lekar, "Kod"),
|
||||
prijmeni = t(jmeno, "Prijmeni") if jmeno is not None else None,
|
||||
jmena = t(jmeno, "Jmena") if jmeno is not None else None,
|
||||
icz = t(el, "ICZ"),
|
||||
icp = t(el, "ICP"),
|
||||
pzs_nazev = t(pzs, "Nazev") if pzs is not None else None,
|
||||
ulice = ulice,
|
||||
mesto = mesto,
|
||||
psc = psc,
|
||||
telefon = t(el, "Telefon"),
|
||||
))
|
||||
return seznam
|
||||
|
||||
|
||||
def parsuj_vydavajici(doklad):
|
||||
"""Vraci seznam slovniku pro tabulku vydavajici."""
|
||||
seznam = []
|
||||
sez_el = doklad.find(f"{{{NS}}}VydavajiciSeznam")
|
||||
if sez_el is None:
|
||||
return seznam
|
||||
for el in sez_el.findall(f"{{{NS}}}Vydavajici"):
|
||||
lekarnik = el.find(f"{{{NS}}}Lekarnik")
|
||||
if lekarnik is None:
|
||||
continue
|
||||
jmeno = lekarnik.find(f"{{{NS}}}Jmeno")
|
||||
pzs = el.find(f"{{{NS}}}PZS")
|
||||
ulice, mesto, psc = _parsuj_adresu(pzs)
|
||||
seznam.append(dict(
|
||||
lekarnik_kod = t(lekarnik, "Kod"),
|
||||
prijmeni = t(jmeno, "Prijmeni") if jmeno is not None else None,
|
||||
jmena = t(jmeno, "Jmena") if jmeno is not None else None,
|
||||
pzs_nazev = t(pzs, "Nazev") if pzs is not None else None,
|
||||
ulice = ulice,
|
||||
mesto = mesto,
|
||||
psc = psc,
|
||||
telefon = t(pzs, "Telefon") if pzs is not None else None,
|
||||
))
|
||||
return seznam
|
||||
|
||||
|
||||
# ── parsovani leku ────────────────────────────────────────────────────────────
|
||||
|
||||
def parsuj_slozky_predpis(lek_el):
|
||||
@@ -385,7 +504,10 @@ def parsuj_xml(xml_soubor):
|
||||
row.update(lek_fields)
|
||||
vydeji.append((row, slozky))
|
||||
|
||||
return zprava, predpisy, vydeji
|
||||
predepisujici = parsuj_predepisujici(doklad)
|
||||
vydavajici = parsuj_vydavajici(doklad)
|
||||
|
||||
return zprava, predpisy, vydeji, predepisujici, vydavajici
|
||||
|
||||
|
||||
# ── ulozeni do DB ─────────────────────────────────────────────────────────────
|
||||
@@ -397,7 +519,7 @@ def _najdi_id(cur, tabulka, sloupec, hodnota):
|
||||
return row["id"] if row else None
|
||||
|
||||
|
||||
def uloz(conn, zprava, predpisy, vydeji):
|
||||
def uloz(conn, zprava, predpisy, vydeji, predepisujici, vydavajici):
|
||||
iplp_predpisu = 0
|
||||
iplp_vydejuu = 0
|
||||
|
||||
@@ -495,6 +617,56 @@ def uloz(conn, zprava, predpisy, vydeji):
|
||||
print(f" vydeji: {vlozeno_v} novych (celkem {len(vydeji)})")
|
||||
print(f" vydej_slozka: {vlozeno_vs} slozek z {iplp_vydejuu} IPLP vydejuu")
|
||||
|
||||
# ── predepisujici ─────────────────────────────────────────────────────
|
||||
vlozeno_pre = 0
|
||||
for row in predepisujici:
|
||||
if not row.get("lekar_kod"):
|
||||
continue
|
||||
cur.execute("""
|
||||
INSERT INTO predepisujici
|
||||
(lekar_kod, prijmeni, jmena, icz, icp,
|
||||
pzs_nazev, ulice, mesto, psc, telefon)
|
||||
VALUES
|
||||
(%(lekar_kod)s, %(prijmeni)s, %(jmena)s, %(icz)s, %(icp)s,
|
||||
%(pzs_nazev)s, %(ulice)s, %(mesto)s, %(psc)s, %(telefon)s)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
prijmeni = VALUES(prijmeni),
|
||||
jmena = VALUES(jmena),
|
||||
icz = VALUES(icz),
|
||||
icp = VALUES(icp),
|
||||
pzs_nazev = VALUES(pzs_nazev),
|
||||
ulice = VALUES(ulice),
|
||||
mesto = VALUES(mesto),
|
||||
psc = VALUES(psc),
|
||||
telefon = VALUES(telefon)
|
||||
""", row)
|
||||
vlozeno_pre += cur.rowcount
|
||||
print(f" predepisujici: {vlozeno_pre} radku (celkem {len(predepisujici)})")
|
||||
|
||||
# ── vydavajici ────────────────────────────────────────────────────────
|
||||
vlozeno_vyd = 0
|
||||
for row in vydavajici:
|
||||
if not row.get("lekarnik_kod"):
|
||||
continue
|
||||
cur.execute("""
|
||||
INSERT INTO vydavajici
|
||||
(lekarnik_kod, prijmeni, jmena,
|
||||
pzs_nazev, ulice, mesto, psc, telefon)
|
||||
VALUES
|
||||
(%(lekarnik_kod)s, %(prijmeni)s, %(jmena)s,
|
||||
%(pzs_nazev)s, %(ulice)s, %(mesto)s, %(psc)s, %(telefon)s)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
prijmeni = VALUES(prijmeni),
|
||||
jmena = VALUES(jmena),
|
||||
pzs_nazev = VALUES(pzs_nazev),
|
||||
ulice = VALUES(ulice),
|
||||
mesto = VALUES(mesto),
|
||||
psc = VALUES(psc),
|
||||
telefon = VALUES(telefon)
|
||||
""", row)
|
||||
vlozeno_vyd += cur.rowcount
|
||||
print(f" vydavajici: {vlozeno_vyd} radku (celkem {len(vydavajici)})")
|
||||
|
||||
conn.commit()
|
||||
|
||||
|
||||
@@ -505,15 +677,16 @@ def main():
|
||||
print(f"XML: {xml} ({xml.stat().st_size // 1024} KB)")
|
||||
|
||||
print("Parsovani XML ...")
|
||||
zprava, predpisy, vydeji = parsuj_xml(xml)
|
||||
print(f" -> {len(predpisy)} predpisu, {len(vydeji)} vydejuu")
|
||||
zprava, predpisy, vydeji, predepisujici, vydavajici = parsuj_xml(xml)
|
||||
print(f" -> {len(predpisy)} predpisu, {len(vydeji)} vydejuu, "
|
||||
f"{len(predepisujici)} predepisujicich, {len(vydavajici)} vydavajicich")
|
||||
|
||||
print("Pripojeni k MySQL ...")
|
||||
conn = pymysql.connect(**DB)
|
||||
try:
|
||||
vytvor_schema(conn)
|
||||
print("Ukladani ...")
|
||||
uloz(conn, zprava, predpisy, vydeji)
|
||||
uloz(conn, zprava, predpisy, vydeji, predepisujici, vydavajici)
|
||||
print("Hotovo OK")
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user