Relativer Pfad in Klasse wird nach Instanzierung nicht erkannt

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
rbaert
User
Beiträge: 20
Registriert: Mittwoch 5. September 2018, 15:37

Hallo zusammen...
Ich stelle mich wohl wieder etwas dumm an. Ich gehe stark davon aus, dass die Lösung ganz einfach wäre, leider komm ich nicht drauf...
Ich habe ein Django-Projekt. Dazu habe ich nun eine Klasse geschrieben, die aus der views.py Datei heraus Instantiiert werden soll. In der Klasse werden Datenbank-Abfragen gemacht.

Projektstruktur:
mein_projekt:
---- sb.sqlite3
---- home:
---------- view.py
---------- .............
---------- programms:
-------------------- send.py
-------------------- .......


Nun habe ich meine klasse 'send' in die view.py importiert:

Code: Alles auswählen

from home.programs.send import Send
Wenn ich die Klasse nun erstelle, kommt ein Fehler, weil die Datenbank-Abfrage nicht gemacht werden konnte, resp. das Queryset leer ist.
Der Pfad zu Datenbank ist in der Klasse, als relativer Pfad angegeben:

Code: Alles auswählen

connection = sqlite3.connect('../../db.sqlite3')
Dieser Pfad bezieht sich auf den Speicherort der Klasse, aber nicht auf den Speicherort der view.py. Ich gehe mal davon aus, das dies der Fehler ist.
Wenn ich aber zum testen, den Pfad in der Klasse anpasse auf:

Code: Alles auswählen

connection = sqlite3.connect('../db.sqlite3')
wirft die view.py trotzdem einen Fehler. Wenn ich aber eine Testdatei im gleichen Ordner wie die view.py erstelle und die Klasse von da aufrufe, funktioniert alles.

Folgende Fragen:
1. Hat jemand eine Ahnung, warum es aus der Testdatei funktioniert, aber nicht aus view.py
2. Wie kann ich solche Fehler umgehen. Dabei denke ich an eine Attribut der Klasse z.B. self.db_path wo ich den relativen Pfad bei der Instantiierung
mitgeben kann. Dabei würde ich aber gerne vom Pfad der aktuellen Datei (hier im Beispiel view.py) ausgehen
z.B. aktuellerPfad + programms/send.py

Danke schon mal für eure Hilfe.
(und ein erneutes sorry für meine Unwissenheit)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rbaert: Relative Pfade beziehen sich auf das aktuelle Arbeitsverzeichnis des Prozesses der das ganze ausführt. Das hat erst einmal gar nichts mit dem Verzeichnis zu tun wo die Python-Quelltexte gespeichert sind. Zugang zur Datenbank wird üblicherweise über die Konfiguration geregelt. Da schreibt man am besten einen absoluten Pfad rein.

In der Klasse, oder im `send`-Modul sollte das letztlich gar nicht stehen. Unflexibler geht es ja kaum. Da würde man eher erwarten, dass man die Zugangsdaten als Argument(e) übergeben kann.

Ansonsten: Wenn Du von dem Pfad eines Moduls ausgehen willst, schau Dir den Namen/das Attribut `__file__` an was es in jedem Modul gibt, und verwende die entsprechenden Funktionen aus `os.path` und Werte wie `os.pardir` um Dir einen passenden Pfad daraus zu basteln.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten