Seite 1 von 1
Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Freitag 2. September 2022, 12:30
von reiscn
Hi zusammen!
Ich versuche mich gerade an Flask in Kombination mit SqlAlchemy. Ich verwende IntelliJ mit Python Plugin.
Wenn ich versuche, eine Model Klasse anzulegen, kommt es zu einem Problem. Das Anlegen von Columns bzw. Mappings für Columns funktioniert bei mir nicht. Ich bekomme außerdem kein Autocomplete angezeigt, hingegen aber eine Warning der IDE, dass "db.Column()" nicht existiert - selbes für "db.String(xx)", "db.Model" geht aber interessanterweise:
Code: Alles auswählen
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from properties import database
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database.DATABASE_FULL_URL
db = SQLAlchemy(app)
# bla bla ...
class Dummy(db.Model):
text = db.Column("text", db.String(100)) # hier Fehler dass Column() und String() nicht verfügbar sind
def __init__(self, text):
self.text = text
In sämtlichen Dokumentationen wird es so gezeigt. Wenn ich das ignoriere und ausführe, bekomme ich
zurück. Was mache ich falsch?
Controller Methode:
Code: Alles auswählen
@app.route("/test")
def test_me():
print("Test route invoked")
print(Dummy.query.all())
Info: Befindet sich alles in einer app.py file
Besten Dank und ein feines Wochenende!
Christian
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Freitag 2. September 2022, 14:17
von noisefloor
Hallo,
welche Ausgabe bekommst du, wenn wenn du nach Instanzierung von SQLAlchemy `print(db)` und `print(dir(db))` im Code einbaust?
Gruß, noisefloor
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Freitag 2. September 2022, 14:59
von __blackjack__
@reiscn: Du zeigst den Code hier nicht zusammenhängend. Im ersten Quelltext kann der Fehler mit `Dummy` nicht vorkommen. Und im zweiten nur wenn das entweder nicht im gleichen Modul steht und `Dummy` halt tatsächlich nicht bekannt gemacht wurde.
Bei Ausnahmen ist es in der Regel auch hilfreich den gesamten Traceback 1:1 zu kopieren, denn der enthält ja mehr Informationen als nur die letzte Zeile.
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Montag 5. September 2022, 11:37
von reiscn
Hi zusammen!
Okay, hier der volle Code:
Code: Alles auswählen
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from properties import database
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database.DATABASE_FULL_URL
db = SQLAlchemy(app)
@app.route("/test")
def test_me():
print("Test route invoked")
print(db)
print(dir(db))
print(Dummy.query.all())
if __name__ == "__main__":
app.run()
class Dummy(db.Model):
text = db.Column("text", db.String(100))
def __init__(self, text):
self.text = text
Das ist alles.
@noisefloor:
Folgende Ausgabe kommt da in der Console:
Code: Alles auswählen
[2022-09-05 12:33:39,672] ERROR in app: Exception on /test [GET]
Traceback (most recent call last):
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask/app.py", line 2525, in wsgi_app
response = self.full_dispatch_request()
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask/app.py", line 1822, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask/app.py", line 1820, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask/app.py", line 1796, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/api/app.py", line 14, in test_me
print(db)
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask_sqlalchemy/__init__.py", line 1115, in __repr__
self.engine.url if self.app or current_app else None
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine
return self.get_engine()
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine
return connector.get_engine()
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine
self._engine = rv = self._sa.create_engine(sa_url, options)
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine
return sqlalchemy.create_engine(sa_url, **engine_opts)
File "<string>", line 2, in create_engine
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/sqlalchemy/util/deprecations.py", line 309, in warned
return fn(*args, **kwargs)
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 548, in create_engine
dbapi = dialect_cls.dbapi(**dbapi_args)
File "/Users/reis/Desktop/git/OWN/PythonRestAPITest/venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 811, in dbapi
import psycopg2
ModuleNotFoundError: No module named 'psycopg2'
127.0.0.1 - - [05/Sep/2022 12:33:39] "GET /test HTTP/1.1" 500 -
Danke euch!
LG
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Montag 5. September 2022, 12:08
von Sirius3
@reiscn: Deine Aussagen darüber, was geht oder nicht geht, hat aber überhaupt nichts mit der Fehlermeldung zu tun.
Die sagt einfach, dass man für den Zugriff auf postgresql-Datenbanken ein zusätzliches Paket installieren muß, nämlich `psycopg2`.
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Montag 5. September 2022, 12:10
von __blackjack__
@reiscn: Naja da ist offensichtlich `Dummy` nicht definiert weil das ja erst definiert würde, wenn der Code von dem `app.run()`-Aufruf zurückkehrt, was er AFAIK niemals tut, und wenn dann wäre es ja auch zu spät, denn wenn der Aufruf zurückkehrt läuft die Webanwendung nicht mehr.
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Dienstag 6. September 2022, 10:52
von reiscn
@Sirius3: Danke für den Tipp. Scheint mit postgres nicht ganz so einfach zu sein, sich zu verbinden. Muss mir das mal im Detail anschauen.
@blackjack: Interessant ist, dass ich (abgesehen von Postgres statt sqlite) alles genau mache wie in div. Tutorials propagiert. Dein Aussage sagt mir dass es von der Herangehensweise grundsätzlich falsch ist. Wie würdest du es machen?
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Dienstag 6. September 2022, 10:59
von Sirius3
@reiscn: __blackjack__ hat nur geschrieben, dass Dein Code hier (
viewtopic.php?p=410097#p410097), nachdem Du das fehlende Paket nachinstalliert hast (wo ich jetzt nicht sehe, warum das nicht ganz so einfach sein sollte), in den nächsten Fehler hineinläufst, weil Dummy nicht definiert ist, weil es erst, nachdem das Programm fast zu Ende ist, definiert wird.
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Dienstag 6. September 2022, 11:12
von reiscn
Ich hab das probiert, und des benötigt eine Art Config File für postgres. Muss mir das im Detail erst anschauen. Jedenfalls reicht dass alleinige installieren des Paketes nicht aus.
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Dienstag 6. September 2022, 11:59
von __blackjack__
@reiscn: Auf Python-Seite reicht das alleinige installieren des Paketes aus. Eine richtiges DBMS hat im Gegensatz zu SQLite aber natürlich einen Server den man konfigurieren muss. Das hat nichts mit Python zu tun und ist üblicherweise auch nicht Thema in Tutorials für Webanwendungen, weil das ein eigenes grösseres Thema ist, für das es auch Tutorials gibt.
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Dienstag 6. September 2022, 12:23
von noisefloor
Hallo,
@reiscn: aber du hast schon PostgreSQL auf deinem Windows-System installiert, der PostgreSQL Server läuft und ist über die mitgelieferten Werkzeige wie z.B. den Kommandozeilenclient oder pgAdmin erreichbar?
Gruß, noisefloo
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Donnerstag 8. September 2022, 10:56
von reiscn
Hallo zusammen!
@blackjack: Danke, ich hatte da wohl einen Krampf im Hirn. Mir hat die Konfiguration gefehlt, deshalb hat es nicht funktioniert. Python ist noch etwas neu für mich.
@noisefloor: Danke dir, ja klar, das läuft alles, ich arbeite ja auch anderweitig mit postgresql. Nur wusste ich von dieser Config für Python nix
Jedenfalls danke an alle für die Hilfe und fürs "Licht ins Dunkel bringen"!
Re: Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt
Verfasst: Donnerstag 8. September 2022, 11:44
von noisefloor
Hallo,
nur um Missverständnisse zu vermeiden: was meinst du genau mit "Konfiguration"? Wenn du auf dem Rechner lokal PostgreSQL laufen hast und ein Python-Module für PostgreSQL installiert hast (wie z.B. `psycopg2`), dann sollte der Zugriff von Python auf den PostgreSQL Server eigentlich OOTB ohne weitere Konfiguration funktionieren.
Gruß, noisefloor