Flask - SqlAlchemy: Keine Instanzmethoden für db Objekt

Django, Flask, Bottle, WSGI, CGI…
Antworten
reiscn
User
Beiträge: 7
Registriert: Mittwoch 9. März 2022, 14:02

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

Code: Alles auswählen

NameError: name 'Dummy' is not defined
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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

welche Ausgabe bekommst du, wenn wenn du nach Instanzierung von SQLAlchemy `print(db)` und `print(dir(db))` im Code einbaust?

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
reiscn
User
Beiträge: 7
Registriert: Mittwoch 9. März 2022, 14:02

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
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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`.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
reiscn
User
Beiträge: 7
Registriert: Mittwoch 9. März 2022, 14:02

@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?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
reiscn
User
Beiträge: 7
Registriert: Mittwoch 9. März 2022, 14:02

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
reiscn
User
Beiträge: 7
Registriert: Mittwoch 9. März 2022, 14:02

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 :D

Jedenfalls danke an alle für die Hilfe und fürs "Licht ins Dunkel bringen"!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten