unten ein paar Ausschnitte (so nicht lauffähig, aber hoffentlich ausreichend für die Erklärung). Das Ganze läuft fehlerfrei. Jedoch ist die eigentliche Frage im Titel des Thread.
Grundsätzlich wird eine csv eingelesen, die etwas merkwürdige Spaltenbezeichnungen hat (beginnen z.B. alle mit einem whitespace). Daher hatte ich constants.py angelegt und diese Strings erstmal Konstanten zugewiesen, da ich nicht weiß, ob sich das Format der csv nicht irgendwann mal ändert. Bei import.csv diese dann einfach benutzt (Es handelt sich statt der 3 Einträge im Beispiel aber tatsächlich um 25 Einträge).
Spätestens beim Hinzufügen von gridmodel.py war klar, dass ich dort zum einen die Spaltennamen übernehmen muss (zu denen ich die Namen der Konstanten verwende, nicht die Original Namen der csv), zum anderen auch die Objekt-Attribute benötige. Also habe ich zwei Dictionarys erstellt, einmal csv-seitig und einmal qt-seitig. Zum einen habe ich jetzt schon eine gewisse Redundanz in constants.py (wobei das ja noch überschaubar wäre), zum anderen aber auch zwischen object_attributes und der eigentlichen Klassendefinition in sqlmodel.py, sowie in den Zuweisungen von csvmodel.py.
Lässt sich das alles kompakter gestalten?
Code: Alles auswählen
# constants.py
DELIMITER = ';'
CAA_NAME = " CAA.Name" # ----> Ursprünglich, jetzt durch dictionary ersetzt
csv_titles = {"CAA_NAME" : " CAA.Name",
"CAA_TYPE" : " CAA.Type",
"CAA_ORIGIN_X" : " CAA.Origin.X",
...
object_attributes = {"CAA_NAME" : "point_name",
"CAA_TYPE" : "point_type",
"CAA_ORIGIN_X" : "point_origin_x",
...
# csvmodel.py
import csv
from constants import csv_titles as ct
from constants import DELIMITER
from sqlmodel import MeasuringPiece
def import_csv(session, m_id, m_filename, offset):
with open(m_filename, newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=DELIMITER)
for row in reader:
o_point = MeasuringPiece(measuring_id = m_id)
o_point.point_name = row[ct["CAA_NAME"]].strip()
o_point.point_type = row[ct["CAA_TYPE"]].strip()
o_point.point_origin_x = float(row[ct["CAA_ORIGIN_X"]].strip().replace(',', '.'))
...
# sqlmodel.py
class MeasuringPiece(Base):
__tablename__ = "part_measuring_piece"
id: Mapped[int] = mapped_column(primary_key=True)
measuring_id: Mapped[int] = mapped_column(ForeignKey("part_measuring.id"))
measuring: Mapped["Measuring"] = relationship(back_populates="measuring_pieces")
point_name: Mapped[str] = mapped_column(String(10))
point_type: Mapped[str] = mapped_column(String(5))
point_origin_x: Mapped[float]
...
# gridmodel.py
from sqlmodel import MeasuringPiece
from constants import (
csv_titles,
object_attributes)
class PointGridModel(QAbstractTableModel):
def __init__(self, session):
super().__init__()
self.column_labels = [v for k, v in csv_titles.items()]
self.column_attributes = [v for k, v in object_attributes.items()]
self.point_data = MeasuringPiece.get_points(session)
...