SQLAlchemy. Operational Error: No such table

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo zusammen,

ich bin mit meinem Latein am Ende:
Ich habe eine Webapplikation mit werkzeug + salalchemy geschrieben, die lokal wunderbar läuft.

Wenn ich die nun auf einem Apache deploye (mod_wsgi, nur ScriptAlias, kein VirtualHost wie in der Werkzeug-Doc beschrieben), so bekomme ich den folgenden Fehler:

Code: Alles auswählen

[Thu Dec 03 11:42:13 2009] [error] 2009-12-03 11:42:13,875 INFO sqlalchemy.engine.base.Engine.0x...1530 SELECT picture.pid AS picture_pid, picture.filename AS picture_filename, picture.suffix AS picture_suffix, picture.description AS picture_description, picture.date AS picture_date, picture.group_id AS picture_group_id, user_group_1.screenname AS user_group_1_screenname, user_group_1.password AS user_group_1_password, user_group_1.avatar AS user_group_1_avatar 
[Thu Dec 03 11:42:13 2009] [error] FROM picture LEFT OUTER JOIN user_group AS user_group_1 ON user_group_1.screenname = picture.group_id ORDER BY picture.date DESC
[Thu Dec 03 11:42:13 2009] [error] 2009-12-03 11:42:13,875 INFO sqlalchemy.engine.base.Engine.0x...1530 []
[Thu Dec 03 11:42:13 2009] [error] 2009-12-03 11:42:13,875 INFO sqlalchemy.engine.base.Engine.0x...1530 ROLLBACK
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222] mod_wsgi (pid=2064): Exception occurred processing WSGI script 'X:/webserver/Apache2.2/htdocs/ws0910/uebung3/flacker/flacker/flacker.wsgi'.
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222] Traceback (most recent call last):
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:/webserver/Apache2.2/htdocs/ws0910/uebung3/flacker/flacker\\application.py", line 33, in __call__
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     return self.dispatch(environ, start_response)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\werkzeug-0.5.1-py2.6.egg\\werkzeug\\utils.py", line 248, in __call__
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     return self.app(environ, start_response)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:/webserver/Apache2.2/htdocs/ws0910/uebung3/flacker/flacker\\application.py", line 48, in dispatch
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     response = handler(request, **kwargs)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:/webserver/Apache2.2/htdocs/ws0910/uebung3/flacker/flacker\\views.py", line 23, in index
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     .order_by(Picture.date.desc()).all()[:10]
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\orm\\query.py", line 1267, in all
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     return list(self)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\orm\\query.py", line 1361, in __iter__
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     return self._execute_and_instances(context)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\orm\\query.py", line 1364, in _execute_and_instances
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     result = self.session.execute(querycontext.statement, params=self._params, mapper=self._mapper_zero_or_none())
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\orm\\session.py", line 755, in execute
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     clause, params or {})
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\engine\\base.py", line 824, in execute
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     return Connection.executors[c](self, object, multiparams, params)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\engine\\base.py", line 874, in _execute_clauseelement
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     return self.__execute_context(context)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\engine\\base.py", line 896, in __execute_context
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     self._cursor_execute(context.cursor, context.statement, context.parameters[0], context=context)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\engine\\base.py", line 950, in _cursor_execute
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     self._handle_dbapi_exception(e, statement, parameters, cursor, context)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]   File "X:\\webserver\\Python26\\lib\\site-packages\\sqlalchemy-0.5.6-py2.6.egg\\sqlalchemy\\engine\\base.py", line 931, in _handle_dbapi_exception
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222]     raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
[Thu Dec 03 11:42:13 2009] [error] [client 139.174.100.222] OperationalError: (OperationalError) no such table: picture u'SELECT picture.pid AS picture_pid, picture.filename AS picture_filename, picture.suffix AS picture_suffix, picture.description AS picture_description, picture.date AS picture_date, picture.group_id AS picture_group_id, user_group_1.screenname AS user_group_1_screenname, user_group_1.password AS user_group_1_password, user_group_1.avatar AS user_group_1_avatar \\nFROM picture LEFT OUTER JOIN user_group AS user_group_1 ON user_group_1.screenname = picture.group_id ORDER BY picture.date DESC' []
Woran kann das liegen? Er "findet" ja augenscheinlich die Tabelle nicht. Wie kann das sein? Bedeutet das, dass er gar keine Connection aufgebaut hat? (Dann würde ich aber doch beim create_engine() Aufruf eine aussagekräftige Fehlermeldung erwarten!

Ich habe per google das hier gefunden:
http://www.mail-archive.com/sqlalchemy@ ... 10375.html

Daraus werde ich aber nicht wirklich schlau! Angelegt habe ich die Datenbank ja bereits (sie existiert auch und ist def. nicht korrupt!). Wozu also das create_all()?

Vor allem: Wenn das ganze lokal läuft, wieso sollte dann etwas am Code nicht stimmen?

Die *.sqlite Datei scheint das Script ja auch zu finden - oder trügt der Schein? Gibt es da eine Möglichkeit abzutesten, ob er sich zu der Datei "connecten" kann?

Wäre toll, wenn jeman einen Tipp für mich hätte.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, ich habe nun folgendes rausgefunden:

Die Datenbank "test.sqlite" liegt im selben Verzeichnis, wie mein "application.wsgi"-Script, in dem ich mein application Objekt erstelle. DImho sollte der Apache-Prozess dann also def. die Datei lesen können. Ich gebe den Pfad zunächst relativ an:

Code: Alles auswählen

application = Flacker(r"sqlite:///foo.sqlite")
Nun kommt obiger Fehler.

Wenn ich aber eine unsinnige Datei angebe (foo.sqlite z.B.), dann bleibt es bei dem obigen Fehler! Wie kann das denn sein? Die datei existiertja gar nicht. Ergo scheint es keine gute Rückmeldung vom Script zu geben, ob das Laden / Anlegen der DB geklappt hat?

Wenn ich den Pfad auf irgend einen einen absoluten Pfadnamen setze, bekomme ich auch einen Operational-Fehler:

Code: Alles auswählen

unable to open database file
Das klingt ja eher nach einer guten Meldung, allerdings habe ich noch keinen absoluten Pfad gefunden, der funktioniert. Imho muss ich doch vom htdocs ausgehend den Pfad so angeben? Oder muss ich vom kompletten Dateisystem ausgehen?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ich denke, dass du bei WSGI + Sqlite einen absoluten Pfad angeben musst (bei Django ist das ja auch gefordert).
Die "unable to open"-Fehlermeldung sieht eher nach einem Problem mit Zugriffsrechten aus. Allerdings geht ein absoluter Pfad immer vom gesamten Dateisystem aus.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ice2k3 hat geschrieben:Ich denke, dass du bei WSGI + Sqlite einen absoluten Pfad angeben musst (bei Django ist das ja auch gefordert).
Die "unable to open"-Fehlermeldung sieht eher nach einem Problem mit Zugriffsrechten aus. Allerdings geht ein absoluter Pfad immer vom gesamten Dateisystem aus.
Sorry, war zwischendurch in der Mensa. Du hast exakt Recht (das hatte ich mittlerweile selber rausgefunden). Ich hatte beim ersten Mal wohl einen Fehler im absoluten Pfad, weswegen das nicht ging.

Naja, ein Glück klappt das jetzt so :-)

Wobei ich die Lösung an sich nicht so besonders glücklich finde. Wie regelt man das denn auf einem Server, wo ich den absoluten Pfad gar nicht kenne?

Zudem finde ich es irgend wie schwach, dass es keine eindeutige Fehlermeldung gibt, wenn die Datei nicht geöffnet werden konnte.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Hyperion hat geschrieben:Wobei ich die Lösung an sich nicht so besonders glücklich finde. Wie regelt man das denn auf einem Server, wo ich den absoluten Pfad gar nicht kenne?
Schreib dir eine Funktion die relative Pfade unterstützt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DasIch hat geschrieben:
Hyperion hat geschrieben:Wobei ich die Lösung an sich nicht so besonders glücklich finde. Wie regelt man das denn auf einem Server, wo ich den absoluten Pfad gar nicht kenne?
Schreib dir eine Funktion die relative Pfade unterstützt.
Danke für den Hinweis :-)
Antworten