Flask sqlalchemy - Aplicação Mínima
-
21-12-2019 - |
Pergunta
Estou começando com Flask sqlalchemy, mas não entendo como funciona a demonstração da página inicial (aqui).
Isso criará a estrutura:
>>> from yourapplication import db
>>> db.create_all()
Mas não entendo onde esses usuários estão armazenados.
>>> 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 se eu fizer Select * from user;
Eu vou 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)
No entanto, a saída é a esperada:
>>> users = User.query.all()
>>> [<User u'admin'>, <User u'guest'>]
Então o que está acontecendo aqui?os usuários são armazenados em cache?memória?Porque não vejo nenhum administrador ou convidado no user
mesa .
Solução
Flask está usando o nome de tabela extremamente infeliz user
. Esta é uma palavra-chave reservada no banco de dados;um alias para o integrado user
função, que por sua vez é um alias para current_user
.É por isso que você obtém o nome da coluna current_user
quando você select * from user
;você está realmente executando a pseudofunção current_user
.
Isso se torna mais confuso pelo fato de "usuário" não usar a sintaxe da função SQL, não ser decorado e pelo fato de ser reescrito pelo analisador, de modo que não haja nenhuma função com esse nome realmente definida, daí o 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)
Se você deseja descrever ou selecionar na tabela definida pelo usuário chamada user
você deve, de acordo com a documentação sobre palavras reservadas, citá-la.Então você deve escrever:
select * from "user";
ou
select * from public."user";
(qualificado pelo esquema).
De forma similar:
\dt "user"
mostrará a estrutura da tabela.
Por favor, reporte um bug no Flask.Não deveria usar uma palavra reservada SQL-92 como nome de relacionamento.
EDITAR:Flask está criando uma tabela chamada ‘user’ porque o nome da classe é User.Para evitar isso, recomenda-se fornecer um __tablename__
opção ao definir o modelo.
class User(db.Model):
__tablename__= 'MyUser'
....
Dessa forma, você pode evitar conflitos com as convenções padrão do banco de dados.