Flask sqlalchemy — минимальное приложение
-
21-12-2019 - |
Вопрос
Я начинаю с 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'
....
Таким образом, вы можете избежать конфликтов с соглашениями базы данных по умолчанию.