Servus!
Nach einer dreimonatigen Pause, bedingt durch einen spontanen und sehr erfreulichen Jobwechsel (habe es als Quereinsteiger in die IT-Brachne, genauer gesagt in ein Ausbildungsprogramm im Bereich Mainframe geschafft) habe ich nun mein altes Pythonprojekt wieder ausgegraben.
Letzter Stand war ein Neuentwurf des Datenbankdesign bzw. der entsprechenden Klasse, und hier sind beim Schreiben Fragen aufgetaucht, schon bevor alle Methoden formuliert waren. Hier der aktuelle Stand:
Code: Alles auswählen
import sqlite3
class Database():
def __init__(self, filepath)
self.connection = sqlite3.connect(filepath)
self.create_tables()
def create_tables(self):
cursor = self.connection.cursor()
cursor.execute('''
create table if not exists
job
(
id integer not null
,bezeichnung text
)
;
create table if not exists
time_slot
(
ref_job integer not null
,von timestamp
,bis timestamp
)
;''')
cursor.execute('''
alter table job
add primary key (id)
;
alter table time_slot
add foreign key zeit_job (ref_job)
references (job)
on delete set null
alter table zeit
add primary key (ref_job)
;
''')
self.connection.commit()
def insert_job(self, title):
cursor = self.connection.cursor()
cursor.execute('''
insert into
job
values
(?)
''', (title, )
)
self.connection.commit()
def insert_time(self, begin, end, ref_job)
cursor = self.connection.cursor()
cursor.execute('''
insert into
time_slot
values
(?,?,?)
''', (ref_job, begin, end)
)
self.connection.commit()
def read_data(self, XXXXXX)
- Das SQL lehnt sich etwas an DB2 an, da ich das in der Ausbildung gelernt habe. Funktioniert das so oder sind da Konstrukte drin, die SQLite nicht kennt? Habe das unterwegs ohne SQLite Referenz geschrieben... bin daher nicht sicher, ob so Sachen wie das nachträgliche Einsetzen der Foreign und Primary Keys so klappt. Uns wurde jedenfalls nahegelegt, erstmal die Tabellenstruktur zu erstellen und dann erst Schlüssel und Constraints anzulegen.
- Beim Lesen der DB gibt es mit diesem Design (das Sirius' Vorschlag folgt) ein Problem: Im Programm wird der Nutzer hauptsächlich über Datumsangaben zugreifen. Sprich: er wird sagen: "gib mir alle Jobs, die ich am 20.03.2017 erledigt habe". Das geht hier - aber nur, wenn man einen Vergleich auf ein nicht-Schlüsselfeld macht. Das soll man nicht tun, aber Datums-/Zeitangaben finde ich als Primärschlüssel schwierig. Man müsste dann z.B. das Feld "von" nehmen, im WHERE Feld des SQL Statements das Datum aus dem Schlüssel ziehen und mit dem übergebenen Datum vergleichen. Datetime Objekte kann ich nicht vom Programm an die Datenbank übergeben, weil sie zu kleinteilig sind: den Nutzer interessieren nur ganze Tage, nicht ein einzelner Zeitabschnitt davon.
Irgendwie ist das aber ungeil...