Fehlermeldungen die keinen stören warum ?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

warum bekomme ich folgendes in der IDE:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

das hab ich nur wenn ich in meinem Programm arbeite.
wenn ich über eine text.py auf die Datenbank zugreife, um zu testen obs alles funktioniert, hab ich das nicht.

hat das was mit der db.open() bzw db.close() was zu tun ?
wenn ich auf die DB zugreifen will, die ist in einer externen DB.py, muss ich ja immer self.Obj=DB_Darsteller().
So heisst die Klasse von der DB.py

Code: Alles auswählen

class DB_Darsteller:
    def  __init__(self):        
        self.db= QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName(str(Path(__file__).absolute().parent / 'DB/DBDarsteller.db')) 
oder setzt man self.Obj global und startet sie nur einmal ?
Das mehrmalige Starten bewirken die Fehlermeldungen bzw in der Konsole die "Vermerke", daher "...die keinen stören" ???
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`Obj` ist ein schlechter Name für ein Attribut, das irgendwas mit Datenbanken zu tun hat.
Bevor Du erneut addDatabase mit dem selben Namen aufrufst, solltest Du das alte Datenbank-Objekt beim Aufräumen auch wieder per removeDatabase entfernen und davor sollte es natürlich keine Queries mehr geben, die noch aktiv sind.
Ansonsten reicht man das einmal erzeugte db-Objekt überall dorthin durch, wo es gebraucht wird. Warum willst Du mehrere Instanzen von DB_Darsteller() erzeugen?
Globale Variablen benutzt man nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Naja im Grunde könnte man schon mit einer globalen Datenbankverbindung arbeiten, man hat die ja bereits weil kein Verbindungsname gesetzt wurde und man deshalb über die statische `QSqlDatabase.database()`-Methode diese globale Defaultverbindung liefert. Sollte man natürlich nicht tun und man sollte a) einen Verbindungsnamen setzen, der b) pro `DB_Darsteller`-Objekt eindeutig ist, und c) sollte nach Benutzung sichergestellt werden, dass die Verbindung auch wieder entfernt wird. Es würde sich vielleicht auch anbieten einen Kontextmanager aus `DB_Darsteller`-Objekten zu machen.

Und die Klasse sollte `DarstellerDB` oder `DarstellerDatenbank` heissen. Keine Abkürzungen, kein Unterstrich, und keine Yoda-Reihenfolge bei den Worten.

Der Pfad enthält ja für meinen Geschmack auch viel zu oft die Abkürzung DB. Und es macht wenig Sinn erst `Path()` zu verwenden um plattformunabhängig zu sein, und dann doch wieder einen hart kodierten "/" in einen Teil des Pfades einzubauen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

@sirius3
...beim Aufräumen auch wieder per removeDatabase entfernen und davor sollte es natürlich keine Queries mehr geben...
QSqlDatabase::database() erhöht den internen referenz-Zähler auf das jewilige DB-Objekt (in deinem Fall die default-Database). Beim Zerstören wird der Zähler runtergezählt. (Läuft per QAtomicInt)
Falls die Anzahl der Referenzen größer 0 ist, spuckt QSqlDatabasePrivate diese Meldung aus.

Wenn du jetzt diese Zeile nimmst:

Code: Alles auswählen

QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());

Referenzierst du ja für dein removeDatabase noch einmal das Objekt. Klar, deshalb kommt die Meldung.
So kommt se nimmer ;)
also close() reicht dann völlig
Antworten