Question

Je débute avec Flask sqlalchemy, mais je ne comprends pas comment fonctionne la démo de la page d'accueil (ici).

Cela créera la structure :

>>> from yourapplication import db
>>> db.create_all()

Mais je ne comprends pas où sont stockés ces utilisateurs.

>>> 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()

Parce que si je le fais Select * from user;

J'aurai:

test=# \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | user | table | postgres
(1 row)

test=# select * from user;
 current_user
--------------
 postgres
(1 row)

Cependant, le résultat est celui attendu :

>>> users = User.query.all()
>>> [<User u'admin'>, <User u'guest'>]

Alors, que se passe-t-il ici ?les utilisateurs sont stockés en cache ?mémoire?Parce que je ne vois aucun administrateur ou invité dans le user tableau .

Était-ce utile?

La solution

Flask utilise le nom de table extrêmement malheureux user. Ceci est un mot-clé réservé dans la base de données;un alias pour le module intégré user fonction, qui est à son tour un alias pour current_user.C'est pourquoi vous obtenez le nom de la colonne current_user lorsque vous select * from user;tu exécutes vraiment la pseudo-fonction current_user.

Ceci est rendu encore plus déroutant par le fait que "user" n'utilise pas la syntaxe des fonctions SQL, il n'est pas décoré, et par le fait qu'il est réécrit par l'analyseur, donc aucune fonction de ce nom n'est réellement définie, d'où le résultat déroutant :

regress=> explain select * from user;
                             QUERY PLAN                             
--------------------------------------------------------------------
 Function Scan on "current_user"  (cost=0.00..0.01 rows=1 width=64)
(1 row)

Si vous souhaitez décrire ou sélectionner dans la table définie par l'utilisateur nommée user vous devez, selon la documentation sur les mots réservés, le citer.Il faut donc écrire :

select * from "user";

ou

select * from public."user";

(qualifié par le schéma).

De la même manière:

\dt "user"

affichera la structure du tableau.

Veuillez signaler un bug contre Flask.Il ne doit pas utiliser de mot réservé SQL-92 comme nom de relation.

MODIFIER:Flask crée une table appelée « utilisateur » car le nom de classe est User.Afin d'éviter cela, il est recommandé de prévoir un __tablename__ option lors de la définition du modèle.

class User(db.Model):
    __tablename__= 'MyUser'
....

De cette façon, vous pouvez éviter les conflits avec les conventions par défaut de la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top