Zugriff auf SQLite über eine Funktion in einer ausgelagerten Klasse

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Nonickatall
User
Beiträge: 19
Registriert: Dienstag 31. Januar 2017, 21:33

Hallo ich programmiere schon länger kleinere Sachen mit Python und komme auch recht gut klar.

Ich habe ein größeres Programm (Haussteuerung) geschrieben, dass auch gut läuft. Ich möchte jetzt allerdings konsequenter in einzelne Klassen aufteilen. Da alle Bereiche regelmäßig auf eine SQLite Datenbank zugreifen, muss ich eine zentrale Klasse für den DB Zugriff schreiben, da ja sonst die Datenbank gesperrt ist, wenn bereis eine andere Klasse darauf zugreift.

Da stehe ich jetzt voll auf dem Schlauch und komme auch mit googeln nicht weiter. :shock:

Normalerweise greife ich ja beispielsweise mit

Code: Alles auswählen

import sqlite3

con = sqlite3.connect("Datenbankpfad")
dbcursor = con.Cursor()
dbcursor.execute("SELECT * FROM 'Tabelle'")
zu.

Wenn ich dann Datensätze auslese, mache ich das mit:

Code: Alles auswählen

for datensatz in dbcursor
	Variable1 = datensatz[0]
	Variable2 = datensatz[1]
Wenn ich jetzt aber eine db Klasse nutzen möchte, um in meiner Anwendung auf diese, mit Hilfe der Funktion "select(SQLText)" zu zugreifen:

Code: Alles auswählen

Import db
 
 SQLText = "SELECT * FROM 'Tabelle'"
 db.select(SQLText)
 
die in meiner Klasse wie folgt definiert ist:

Code: Alles auswählen

import sqlite3

con = sqlite3.connect("Datenbankpfad")
dbcursor = con.Cursor()

def select(SQLText):
	db.select(SQLText)
Wie gestalte ich denn dann die Rückgabe, so das ich die Datensätze bekomme?

denn:

Code: Alles auswählen

return datensatz[0]
liefert nur den ersten Datensatz.

Des weiteren müsste ich ja die maximale Anzahl von Feldern prüfen, damit ich keine Fehler generiere, wenn ein SQL auf eine Tabelle mit acht und ein anderes auf eine Tabelle mit drei Felder zugreift.

Kann mir da jemand helfen?

Vielen Dank im Voraus
Ralf
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Nonickatall hat geschrieben: Montag 9. November 2020, 18:10
Wie gestalte ich denn dann die Rückgabe, so das ich die Datensätze bekomme?

denn:

Code: Alles auswählen

return datensatz[0]
liefert nur den ersten Datensatz.
datensatz[0] liefert den 1. Datensatz
datensatz[1] liefert den 2. Datensatz
usw

Der Wert in der eckigen Klammer gibt an, welches "Element" aus einer Liste/Tuple zurückgegeben werden soll. Dabei beginnt die Zählung bei 0 für das erste "Element". Wird nichts angegeben, dann bekommt man die komplette Liste/Tuple zurück.

Demnach solte "return datensatz" das komplette Ergebnis der select-Anweisung zurückgeben.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nonickatall: beim Programmieren ist Sorgfalt wichtig. In Deinen Codefragmenten passt die groß-klein-Schreibung nicht. Es fehlen Doppelpunkte und die Einrückung ist nicht korrekt.
Ich sehe nirgends eine Klasse, so dass die Fragen für mich unverständlich sein.
Da Du ja weißt, welche Tabellen du abfrägst, bzw. noch besser gar kein *-Select benutzt, sondern die relevanten Felder immer explizit angibst, gibt es kein Problem, dass eine Tabelle mehr die andere weniger Felder hat.

Wie sieht Dein richtiger Code aus, vollständig, und was ist das konkrete Problem inklusive Fehlermeldung? Es ist meist nicht sinnvoll, Klassen nur der Klassen wegen zu definieren.
Antworten