Вопрос

Я начинаю с Flask sqlalchemy, но не понимаю, как работает демо-версия домашней страницы (здесь).

Это создаст структуру:

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

Но я не понимаю, где хранятся эти пользователи.

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

Потому что если я это сделаю Select * from user;

Я получу:

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

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

Однако результат ожидаем:

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

Итак, что здесь происходит?пользователи хранятся в кеше?Память?Потому что я не вижу ни администратора, ни гостя в user стол .

Это было полезно?

Решение

Flask использует крайне неудачное имя таблицы user. Это зарезервированное ключевое слово в базе данных.;псевдоним для встроенного user функция, которая, в свою очередь, является псевдонимом для current_user.Вот почему вы получаете имя столбца current_user когда ты select * from user;ты действительно запускаешь псевдофункцию current_user.

Это становится еще более запутанным из-за того, что «пользователь» не использует синтаксис функции SQL, он не оформлен, а также из-за того, что он переписан синтаксическим анализатором, поэтому на самом деле не определена функция с таким именем, отсюда и запутанный результат:

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

Если вы хотите описать или выбрать из определяемой пользователем таблицы с именем user согласно документации по зарезервированным словам, вы должны цитировать их.Итак, вы должны написать:

select * from "user";

или

select * from public."user";

(с указанием схемы).

Сходным образом:

\dt "user"

покажет структуру таблицы.

Пожалуйста, сообщите об ошибке в Flask.В качестве имени отношения не следует использовать зарезервированное слово SQL-92.

РЕДАКТИРОВАТЬ:Flask создает таблицу с именем «пользователь», поскольку имя класса — «Пользователь».Чтобы этого избежать, рекомендуется предусмотреть __tablename__ вариант при определении модели.

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

Таким образом, вы можете избежать конфликтов с соглашениями базы данных по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top