1+ from psycopg import connect , sql , errors
2+ from auth import auth
13from dataclasses import dataclass
24from datetime import datetime
35
@@ -10,6 +12,33 @@ class Kraj:
1012 def __str__ (self ):
1113 return f"{ self .posta } { self .kraj } "
1214
15+ @classmethod
16+ def ustvari_tabelo (cls , pobrisi = False , ce_ne_obstaja = False ):
17+ with conn .transaction ():
18+ if pobrisi :
19+ cls .izbrisi_tabelo (ce_ne_obstaja )
20+ with conn .cursor () as cur :
21+ cur .execute (sql .SQL (
22+ """
23+ CREATE TABLE {ce_ne_obstaja} kraj (
24+ posta INTEGER PRIMARY KEY,
25+ kraj TEXT NOT NULL
26+ );
27+ """ ).format (
28+ ce_ne_obstaja = sql .SQL ("IF NOT EXISTS" if ce_ne_obstaja else "" )
29+ ))
30+
31+ @classmethod
32+ def izbrisi_tabelo (cls , ce_obstaja = False ):
33+ with conn .transaction ():
34+ with conn .cursor () as cur :
35+ cur .execute (sql .SQL (
36+ """
37+ DROP TABLE {ce_obstaja} kraj;
38+ """ ).format (
39+ ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
40+ ))
41+
1342
1443@dataclass
1544class Oseba :
@@ -19,12 +48,68 @@ class Oseba:
1948 naslov : str
2049 kraj : Kraj
2150
51+ @classmethod
52+ def ustvari_tabelo (cls , pobrisi = False , ce_ne_obstaja = False ):
53+ with conn .transaction ():
54+ if pobrisi :
55+ cls .izbrisi_tabelo (ce_ne_obstaja )
56+ with conn .cursor () as cur :
57+ cur .execute (sql .SQL (
58+ """
59+ CREATE TABLE {ce_ne_obstaja} oseba (
60+ emso TEXT PRIMARY KEY,
61+ ime TEXT NOT NULL,
62+ priimek TEXT NOT NULL,
63+ naslov TEXT NOT NULL,
64+ kraj INTEGER NOT NULL REFERENCES kraj(posta)
65+ );
66+ """ ).format (
67+ ce_ne_obstaja = sql .SQL ("IF NOT EXISTS" if ce_ne_obstaja else "" )
68+ ))
69+
70+ @classmethod
71+ def izbrisi_tabelo (cls , ce_obstaja = False ):
72+ with conn .transaction ():
73+ with conn .cursor () as cur :
74+ cur .execute (sql .SQL (
75+ """
76+ DROP TABLE {ce_obstaja} oseba;
77+ """ ).format (
78+ ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
79+ ))
2280
2381@dataclass
2482class Racun :
2583 stevilka : int
2684 lastnik : Oseba
2785
86+ @classmethod
87+ def ustvari_tabelo (cls , pobrisi = False , ce_ne_obstaja = False ):
88+ with conn .transaction ():
89+ if pobrisi :
90+ cls .izbrisi_tabelo (ce_ne_obstaja )
91+ with conn .cursor () as cur :
92+ cur .execute (sql .SQL (
93+ """
94+ CREATE TABLE {ce_ne_obstaja} racun (
95+ stevilka SERIAL PRIMARY KEY,
96+ lastnik TEXT NOT NULL REFERENCES oseba(emso)
97+ );
98+ """ ).format (
99+ ce_ne_obstaja = sql .SQL ("IF NOT EXISTS" if ce_ne_obstaja else "" )
100+ ))
101+
102+ @classmethod
103+ def izbrisi_tabelo (cls , ce_obstaja = False ):
104+ with conn .transaction ():
105+ with conn .cursor () as cur :
106+ cur .execute (sql .SQL (
107+ """
108+ DROP TABLE {ce_obstaja} racun;
109+ """ ).format (
110+ ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
111+ ))
112+
28113
29114@dataclass
30115class Transakcija :
@@ -33,3 +118,51 @@ class Transakcija:
33118 znesek : int
34119 cas : datetime = None
35120 opis : str = None
121+
122+ @classmethod
123+ def ustvari_tabelo (cls , pobrisi = False , ce_ne_obstaja = False ):
124+ with conn .transaction ():
125+ if pobrisi :
126+ cls .izbrisi_tabelo (ce_ne_obstaja )
127+ with conn .cursor () as cur :
128+ cur .execute (sql .SQL (
129+ """
130+ CREATE TABLE {ce_ne_obstaja} transakcija (
131+ id SERIAL PRIMARY KEY,
132+ racun INTEGER NOT NULL REFERENCES racun(stevilka),
133+ znesek INTEGER NOT NULL,
134+ cas TIMESTAMP(0) NOT NULL DEFAULT (NOW()),
135+ opis TEXT
136+ );
137+ """ ).format (
138+ ce_ne_obstaja = sql .SQL ("IF NOT EXISTS" if ce_ne_obstaja else "" )
139+ ))
140+
141+ @classmethod
142+ def izbrisi_tabelo (cls , ce_obstaja = False ):
143+ with conn .transaction ():
144+ with conn .cursor () as cur :
145+ cur .execute (sql .SQL (
146+ """
147+ DROP TABLE {ce_obstaja} transakcija;
148+ """ ).format (
149+ ce_obstaja = sql .SQL ("IF EXISTS" if ce_obstaja else "" )
150+ ))
151+
152+
153+ RAZREDI = [Kraj , Oseba , Racun , Transakcija ]
154+
155+
156+ def ustvari_tabele (pobrisi = False , ce_ne_obstaja = False ):
157+ with conn .transaction ():
158+ if pobrisi :
159+ for cls in reversed (RAZREDI ):
160+ cls .izbrisi_tabelo (ce_ne_obstaja )
161+ for cls in RAZREDI :
162+ cls .ustvari_tabelo (ce_ne_obstaja = ce_ne_obstaja )
163+
164+
165+ def vzpostavi_povezavo (** kwargs ):
166+ global conn
167+ conn = connect (** auth , ** kwargs )
168+ return conn
0 commit comments