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 .

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top