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 .

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top