notebookvb
This commit is contained in:
@@ -1,12 +1,14 @@
|
||||
"""
|
||||
Nacte odpoved lekoveho zaznamu (XML) a ulozi ji do MySQL.
|
||||
Schema: zprava / predpis / predpis_slozka / vydej / vydej_slozka
|
||||
Schema: pacient / zprava / predpis / predpis_slozka / vydej / vydej_slozka / predepisujici / vydavajici
|
||||
Typy a delky presne dle XSD (Cuer2Schema.xsd + CuerSchema.xsd, verze 202501A)
|
||||
|
||||
Spusteni:
|
||||
Spusteni (jednorazova inicializace + import jednoho XML):
|
||||
python 06UlozitDoMySQL.py
|
||||
nebo:
|
||||
python 06UlozitDoMySQL.py cesta/k/odpoved.xml
|
||||
|
||||
Pro hromadne stazeni vsech pacientu pouzij 07StahnoutVsechny.py.
|
||||
"""
|
||||
|
||||
import sys
|
||||
@@ -47,25 +49,49 @@ def ts(s):
|
||||
|
||||
|
||||
# ── DDL ───────────────────────────────────────────────────────────────────────
|
||||
DDL_TABULKY = [
|
||||
# smazat v opacnem poradi kvuli FK
|
||||
|
||||
# Pouziva se ve vytvor_schema() (DROP + CREATE) pro ciste spusteni
|
||||
DDL_DROP = [
|
||||
"DROP TABLE IF EXISTS predpis_slozka",
|
||||
"DROP TABLE IF EXISTS vydej_slozka",
|
||||
"DROP TABLE IF EXISTS vydej",
|
||||
"DROP TABLE IF EXISTS predpis",
|
||||
"DROP TABLE IF EXISTS zprava",
|
||||
"DROP TABLE IF EXISTS pacient",
|
||||
"DROP TABLE IF EXISTS predepisujici",
|
||||
"DROP TABLE IF EXISTS vydavajici",
|
||||
]
|
||||
|
||||
DDL_CREATE = [
|
||||
# ── pacient ───────────────────────────────────────────────────────────────
|
||||
# Zrcadlo registrovanych pacientu z Medicusu (Firebird).
|
||||
# idpac = IDPAC z KAR tabulky Medicusu.
|
||||
# poznamka: posledni chyba API (napr. "neztotozneny pacient"); NULL = OK
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS pacient (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
idpac INT NOT NULL UNIQUE,
|
||||
prijmeni VARCHAR(35) NOT NULL,
|
||||
jmena VARCHAR(24),
|
||||
datum_narozeni DATE NOT NULL,
|
||||
aktivni TINYINT(1) NOT NULL DEFAULT 1,
|
||||
poznamka VARCHAR(500),
|
||||
INDEX idx_prijmeni (prijmeni)
|
||||
) ENGINE=InnoDB
|
||||
""",
|
||||
|
||||
# ── zprava ────────────────────────────────────────────────────────────────
|
||||
# zprava_odpoved_type + zprava_type:
|
||||
# ID_Zpravy CHAR(36), Verze, Odeslano dateTime
|
||||
# Aplikace(512), ID_Podani CHAR(36), Prijato dateTime
|
||||
# jmeno_osoby_type: Prijmeni(35), Jmena(24)
|
||||
# pacient_id: FK na pacient.id (NULL pokud volano z 06 primo)
|
||||
# xml_soubor: relativni cesta k ulozene XML odpovedi
|
||||
"""
|
||||
CREATE TABLE zprava (
|
||||
CREATE TABLE IF NOT EXISTS zprava (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
id_zpravy CHAR(36) NOT NULL UNIQUE,
|
||||
pacient_id INT,
|
||||
verze VARCHAR(20),
|
||||
odeslano DATETIME,
|
||||
aplikace VARCHAR(512),
|
||||
@@ -74,8 +100,11 @@ DDL_TABULKY = [
|
||||
pacient_prijmeni VARCHAR(35),
|
||||
pacient_jmena VARCHAR(24),
|
||||
pacient_datum_narozeni DATE,
|
||||
xml_soubor VARCHAR(255),
|
||||
stazeno DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
INDEX idx_pacient (pacient_prijmeni, pacient_datum_narozeni)
|
||||
FOREIGN KEY (pacient_id) REFERENCES pacient(id) ON DELETE SET NULL,
|
||||
INDEX idx_pacient_id (pacient_id),
|
||||
INDEX idx_pacient (pacient_prijmeni, pacient_datum_narozeni)
|
||||
) ENGINE=InnoDB
|
||||
""",
|
||||
|
||||
@@ -90,7 +119,7 @@ DDL_TABULKY = [
|
||||
# inn_predpis_type: Nazev(200) — nejdelsi nazev mezi typy
|
||||
# iplp_predpis_type: PostupPripravy(4000), Nazev(146), CestaPodani(15), Forma(27)
|
||||
"""
|
||||
CREATE TABLE predpis (
|
||||
CREATE TABLE IF NOT EXISTS predpis (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
zprava_id INT NOT NULL,
|
||||
id_lp_predpis CHAR(36) NOT NULL UNIQUE,
|
||||
@@ -120,7 +149,7 @@ DDL_TABULKY = [
|
||||
# Mnozstvi DECIMAL(15,6) NOT NULL, Jednotka ENUM('g','ks') NOT NULL,
|
||||
# Nazev(200) NOT NULL, Surovina CHAR(7)?, HVLPReg CHAR(7)?
|
||||
"""
|
||||
CREATE TABLE predpis_slozka (
|
||||
CREATE TABLE IF NOT EXISTS predpis_slozka (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
predpis_id INT NOT NULL,
|
||||
mnozstvi DECIMAL(15,6) NOT NULL,
|
||||
@@ -140,7 +169,7 @@ DDL_TABULKY = [
|
||||
# lek — vzdy jen jeden z: HVLPReg / HVLPNereg / IPLP
|
||||
# iplp_type (vydej): KodVZP CHAR(7)?, PostupPripravy(4000), Nazev(146), CestaPodani(15)
|
||||
"""
|
||||
CREATE TABLE vydej (
|
||||
CREATE TABLE IF NOT EXISTS vydej (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
zprava_id INT NOT NULL,
|
||||
id_lp_vydej CHAR(36) NOT NULL UNIQUE,
|
||||
@@ -175,7 +204,7 @@ DDL_TABULKY = [
|
||||
# Nazev(200) NOT NULL, HrazenoZP DECIMAL(9,2)?,
|
||||
# Surovina CHAR(7)?, HVLPReg CHAR(7)?
|
||||
"""
|
||||
CREATE TABLE vydej_slozka (
|
||||
CREATE TABLE IF NOT EXISTS vydej_slozka (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
vydej_id INT NOT NULL,
|
||||
mnozstvi DECIMAL(15,6) NOT NULL,
|
||||
@@ -197,7 +226,7 @@ DDL_TABULKY = [
|
||||
# Telefon(20)?
|
||||
# lekar_kod = predpis.kod_predepisujiciho
|
||||
"""
|
||||
CREATE TABLE predepisujici (
|
||||
CREATE TABLE IF NOT EXISTS predepisujici (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
lekar_kod CHAR(36) NOT NULL UNIQUE,
|
||||
prijmeni VARCHAR(35),
|
||||
@@ -220,7 +249,7 @@ DDL_TABULKY = [
|
||||
# PZS: Nazev(200), Telefon(20)?, Adresa: NazevUlice, CisloPopisne, CisloOrientacni, NazevObce, PSC
|
||||
# lekarnik_kod = vydej.kod_vydavajiciho
|
||||
"""
|
||||
CREATE TABLE vydavajici (
|
||||
CREATE TABLE IF NOT EXISTS vydavajici (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
lekarnik_kod CHAR(36) NOT NULL UNIQUE,
|
||||
prijmeni VARCHAR(35),
|
||||
@@ -236,13 +265,38 @@ DDL_TABULKY = [
|
||||
|
||||
|
||||
def vytvor_schema(conn):
|
||||
"""DROP + CREATE vsech tabulek. Pouzij pro ciste spusteni / reset dat."""
|
||||
with conn.cursor() as cur:
|
||||
for stmt in DDL_TABULKY:
|
||||
for stmt in DDL_DROP:
|
||||
cur.execute(stmt)
|
||||
for stmt in DDL_CREATE:
|
||||
stmt = stmt.strip()
|
||||
if stmt:
|
||||
cur.execute(stmt)
|
||||
conn.commit()
|
||||
print("Schema OK (5 tabulek smazano a vytvoreno znovu)")
|
||||
print("Schema OK — tabulky smazany a vytvoreny znovu")
|
||||
|
||||
|
||||
def inicializuj_schema(conn):
|
||||
"""CREATE TABLE IF NOT EXISTS — bezpecne pro opakowane spusteni (neznici data)."""
|
||||
with conn.cursor() as cur:
|
||||
for stmt in DDL_CREATE:
|
||||
stmt = stmt.strip()
|
||||
if stmt:
|
||||
cur.execute(stmt)
|
||||
# Zpetna kompatibilita: pridat sloupec poznamka pokud jeste neexistuje
|
||||
cur.execute("""
|
||||
SELECT COUNT(*) AS cnt
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'pacient'
|
||||
AND COLUMN_NAME = 'poznamka'
|
||||
""")
|
||||
if cur.fetchone()["cnt"] == 0:
|
||||
cur.execute(
|
||||
"ALTER TABLE pacient ADD COLUMN poznamka VARCHAR(500) NULL DEFAULT NULL"
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
|
||||
# ── parsovani predepisujicich a vydavajicich ─────────────────────────────────
|
||||
@@ -519,25 +573,36 @@ def _najdi_id(cur, tabulka, sloupec, hodnota):
|
||||
return row["id"] if row else None
|
||||
|
||||
|
||||
def uloz(conn, zprava, predpisy, vydeji, predepisujici, vydavajici):
|
||||
def uloz(conn, zprava, predpisy, vydeji, predepisujici, vydavajici,
|
||||
pacient_id=None, xml_soubor=None):
|
||||
"""
|
||||
Ulozi parsovana data do MySQL.
|
||||
pacient_id — FK na tabulku pacient (None pokud volano primo z 06)
|
||||
xml_soubor — relativni cesta k archivnimu XML souboru (None pokud neni archivovano)
|
||||
"""
|
||||
iplp_predpisu = 0
|
||||
iplp_vydejuu = 0
|
||||
|
||||
with conn.cursor() as cur:
|
||||
|
||||
# ── zprava ────────────────────────────────────────────────────────────
|
||||
zprava_row = dict(zprava)
|
||||
zprava_row["pacient_id"] = pacient_id
|
||||
zprava_row["xml_soubor"] = xml_soubor
|
||||
cur.execute("""
|
||||
INSERT INTO zprava
|
||||
(id_zpravy, verze, odeslano, aplikace, id_podani, prijato,
|
||||
pacient_prijmeni, pacient_jmena, pacient_datum_narozeni)
|
||||
(id_zpravy, pacient_id, verze, odeslano, aplikace, id_podani, prijato,
|
||||
pacient_prijmeni, pacient_jmena, pacient_datum_narozeni, xml_soubor)
|
||||
VALUES
|
||||
(%(id_zpravy)s, %(verze)s, %(odeslano)s, %(aplikace)s,
|
||||
(%(id_zpravy)s, %(pacient_id)s, %(verze)s, %(odeslano)s, %(aplikace)s,
|
||||
%(id_podani)s, %(prijato)s,
|
||||
%(pacient_prijmeni)s, %(pacient_jmena)s, %(pacient_datum_narozeni)s)
|
||||
%(pacient_prijmeni)s, %(pacient_jmena)s, %(pacient_datum_narozeni)s,
|
||||
%(xml_soubor)s)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
prijato = VALUES(prijato),
|
||||
stazeno = CURRENT_TIMESTAMP
|
||||
""", zprava)
|
||||
prijato = VALUES(prijato),
|
||||
xml_soubor = COALESCE(VALUES(xml_soubor), xml_soubor),
|
||||
stazeno = CURRENT_TIMESTAMP
|
||||
""", zprava_row)
|
||||
zprava_id = _najdi_id(cur, "zprava", "id_zpravy", zprava["id_zpravy"])
|
||||
print(f" zprava id={zprava_id} ({zprava['id_zpravy']})")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user