Pregunta

Estoy empezando con Flask sqlalchemy, pero no entiendo cómo funciona la demostración de la página de inicio (aquí).

Esto creará la estructura:

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

Pero no entiendo dónde se almacenan estos usuarios.

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

Porque si lo hago Select * from user;

Voy a conseguir:

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

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

Sin embargo, el resultado es el esperado:

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

Entonces, ¿qué está pasando aquí?¿los usuarios están almacenados en caché?¿memoria?Porque no veo ningún administrador o invitado en el user mesa .

¿Fue útil?

Solución

Flask está usando el nombre de tabla extremadamente desafortunado user. Esta es una palabra clave reservada en la base de datos;un alias para el built-in user función, que a su vez es un alias para current_user.Por eso obtienes el nombre de la columna current_user cuando tú select * from user;realmente estás ejecutando la pseudofunción current_user.

Esto se vuelve más confuso por el hecho de que "usuario" no usa la sintaxis de la función SQL, no está decorado y por el hecho de que el analizador lo reescribe, por lo que no hay una función con ese nombre realmente definida, de ahí el resultado confuso:

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

Si desea describir o seleccionar de la tabla definida por el usuario denominada user debe, según la documentación sobre palabras reservadas, citarlo.Entonces debes escribir:

select * from "user";

o

select * from public."user";

(esquema calificado).

Del mismo modo:

\dt "user"

mostrará la estructura de la tabla.

Por favor, informe de un error en Flask.No debe usar una palabra reservada SQL-92 como nombre de relación.

EDITAR:Flask está creando una tabla llamada 'usuario' porque el nombre de clase es Usuario.Para evitar esto, se recomienda proporcionar un __tablename__ opción al definir el modelo.

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

De esta manera, puede evitar los conflictos con las convenciones predeterminadas de la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top