Flask sqlalchemy-Aplicación mínima
-
21-12-2019 - |
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 .
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.