Fläschchen sqlalchemy – Minimale Anwendung
-
21-12-2019 - |
Frage
Ich beginne mit Flask sqlalchemy, verstehe aber nicht, wie die Demo der Homepage funktioniert (Hier).
Dadurch wird die Struktur erstellt:
>>> from yourapplication import db
>>> db.create_all()
Aber ich verstehe nicht, wo diese Benutzer gespeichert sind.
>>> from yourapplication import User
>>> admin = User('admin', 'admin@example.com')
>>> guest = User('guest', 'guest@example.com')
>>> db.session.add(admin)
>>> db.session.add(guest)
>>> db.session.commit()
Denn wenn ich es tue Select * from user;
Ich werde bekommen:
test=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | user | table | postgres
(1 row)
test=# select * from user;
current_user
--------------
postgres
(1 row)
Die Ausgabe ist jedoch die erwartete:
>>> users = User.query.all()
>>> [<User u'admin'>, <User u'guest'>]
Also, was passiert hier?werden die Benutzer im Cache gespeichert?Erinnerung?Weil ich keinen Administrator oder Gast darin sehe user
Tisch .
Lösung
Flask verwendet den äußerst unglücklichen Tabellennamen user
. Dies ist ein reserviertes Schlüsselwort in der Datenbank;ein Alias für die integrierte user
Funktion, die wiederum ein Alias für ist current_user
.Deshalb erhalten Sie den Spaltennamen current_user
wenn du select * from user
;Sie führen in Wirklichkeit die Pseudofunktion aus current_user
.
Dies wird noch verwirrender durch die Tatsache, dass „user“ keine SQL-Funktionssyntax verwendet, sie nicht dekoriert ist und durch die Tatsache, dass sie vom Parser umgeschrieben wird, sodass tatsächlich keine Funktion mit diesem Namen definiert ist, daher das verwirrende Ergebnis:
regress=> explain select * from user;
QUERY PLAN
--------------------------------------------------------------------
Function Scan on "current_user" (cost=0.00..0.01 rows=1 width=64)
(1 row)
Wenn Sie die benutzerdefinierte Tabelle mit dem Namen beschreiben oder aus ihr auswählen möchten user
Sie müssen es gemäß der Dokumentation zu reservierten Wörtern zitieren.Sie müssen also schreiben:
select * from "user";
oder
select * from public."user";
(Schema-qualifiziert).
Ähnlich:
\dt "user"
zeigt die Tabellenstruktur an.
Bitte melden Sie einen Fehler gegen Flask.Es sollte kein reserviertes SQL-92-Wort als Beziehungsname verwendet werden.
BEARBEITEN:Flask erstellt eine Tabelle mit dem Namen „user“, da der Klassenname „User“ lautet.Um dies zu vermeiden, wird empfohlen, a __tablename__
Option beim Definieren des Modells.
class User(db.Model):
__tablename__= 'MyUser'
....
Auf diese Weise können Sie Konflikte mit Standardkonventionen der Datenbank vermeiden.