control variabel verwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DiNo57
User
Beiträge: 2
Registriert: Donnerstag 21. Januar 2021, 10:58

Hallo Leute,
ich bin dabei, mich in Python einzuarbeiten, das klappt bisher auch ganz gut.
Jetzt habe ich ein Problem und mit aller Mühe und Sucherei nichts dazu gefunden.
Ich weiss nicht, ob es an meinem wording liegt, oder daran, dass mein Problem so exotisch ist.

Nun meine Frage:
ich habe eine Funktion geschrieben, die liest alle Spaltenbreiten von einem qTableWidget und schreib sie als Array in eine DB
Das funktioniert wunderbar, auch das Zurücklesen ist problemlos. (Mit einer weiteren Funktion)
Da ich in meinem Programm eine ganze Reihe qTableWidget verwende, möchte ich die Funktion gerne variabel machen, d. h. den Namen des qTableWidget als Parameter übergeben.
Daran bin ich bisher gescheitert.
Mein Code sieht so aus:

Code: Alles auswählen

def writeColumnPar(self):
    cnxn = OpenDB()
    cursor = cnxn.cursor()
    i = 0
    colCount = self.tblKanaeleDef.columnCount()
    colWArray = ""
    while i < colCount:
        colWArray += str(self.tblKanaeleDef.columnWidth(i) )+ ";"
        i = i + 1
        
    selSql = "Select ID FROM properties where Type = 'tblKanaeleDef'"
    cursor.execute(selSql)
    row = cursor.fetchone()

    if row[0] > 0:
        updateSql = "Update properties set Value = '" + colWArray + "' where ID = " + str(row[0])
    else:
        updateSql = "Insert into properties (Aquarium_ID, Type, Value) Values ("
        updateSql += str(self.tblAquarien.item(self.tblAquarien.currentRow(),  0).text())
        updateSql += ", 'tblKanaeleDef', '" + colWArray + "')"

    cursor.execute(updateSql)
    cnxn.commit()
    
    cursor.close()
    cnxn.close()
ich möchte gerne:

Code: Alles auswählen

def writeColumnPar(self, tbl):
    cnxn = OpenDB()
    cursor = cnxn.cursor()
    i = 0
    colCount = self.tbl.columnCount()
also tbl soll der Name des qTableWidget sein, dass es so nicht funktioniert ist klar.

Gibt es einen Weg, wie man das richtig macht?

Vielen Dank für jeden Tipp,

freundliche Grüsse DiNo57
radi
User
Beiträge: 8
Registriert: Freitag 15. Januar 2021, 12:15

Du kannst alle Tables in eine Liste oder in einen dict ablegen und dann das entspr. Element aufrufen.

Oder du übergibtst den Table wie du zeigst aber dann rufst du ihn ohne "self" auf.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen. Was soll denn cnxn bedeuten? Oder colWArray? Zumal das ein String ist und kein Array. Das wichtige daran ist doch wohl das W, also width. tblKanaeleDef -> kanal_definitionen?
Variablennamen und Funktionen werden komplett klein geschrieben. OpenDB ist z.B. so geschrieben wie eine Klasse, vom Namen her ist das aber eine Funktion.
Statt der while-Schleife benutzt man eine for-Schleife.
Strings stückelt man nicht + zusammen. Hier würde man erst eine Liste erzeugen und die dann per join in einen String verwandeln.

Jetzt gibt es den schlimmsten Fehler: NIEMALS Parameter in SQL-Strings hineinformatieren oder gar par + zusammenstückeln. Man benutzt Parameter. Die hängen von der verwendeten Datenbank ab.
Ich nehme mal %s.
`fetchone` liefert None, wenn kein Eintrag gefunden wird. Eine ID ist immer positiv. Dass Du da immer auf die ID zugreifst und die auch negativ oder 0 sein kann, ist komisch.

Code: Alles auswählen

def write_column_parameters(self):
    connection = open_database()
    cursor = connection.cursor()
    column_count = self.tblKanaeleDef.columnCount()
    widths = []
    for i in range(column_count):
        widths.append(self.tblKanaeleDef.columnWidth(i))
    widths = ';'.join(map(str, widths))

    cursor.execute("Select ID FROM properties where Type=%s", ['tblKanaeleDef'])
    row = cursor.fetchone()
    if not row:
        cursor.execute("Insert into properties (Aquarium_ID, Type, Value) Values (%s, %s, %s)",
            [self.tblAquarien.item(self.tblAquarien.currentRow(),  0).text(),
             'tblKanaeleDef',
             widths])
    else:
        cursor.execute("Update properties set Value = %s where ID = %s", [widths, row[0]])
    connection.commit()
    
    cursor.close()
    connection.close()
Viele SQL-Dialekte kennen auch in upsert, also eine Kombination aus INSERT und UPDATE.

Zum Problem: Du mußt das Attribut direkt übergeben `self.write_column_parameters(self.tblKanaeleDef)`.
DiNo57
User
Beiträge: 2
Registriert: Donnerstag 21. Januar 2021, 10:58

Hallo Sirius3,
vielen Dank für Deine Mühe, die Analyse und die ausführliche Antwort.
Zuerst mal: durch Deinen Tipp ist mein Problem gelöst, super!
Die anderen Punkte werde ich anschauen und mir zu Herzen nehmen.
Ich wünsche Dir einen schönen Sonntag,
freundliche Grüsse
DiNo57
Antworten