플라스크에 정밀한 웹 애플리케이션을 빨리 빌드-간단한 응용 프로그램
-
21-12-2019 - |
문제
나는 시작으로 플라스크에 정밀한 웹 애플리케이션을 빨리 빌지만,저는 이해하지 못하는 방법을 작품의 데모 홈페이지(기).
이것은 구조 만들기:
>>> 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;
I 얻을 것이다:
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
테이블.
해결책
플라스크를 사용하여 매우 불행한 일이블 이름 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";
(스키마-qualified).
마찬가지로:
\dt "user"
표시됩니다 테이블의 구조입니다.
버그를 보고해 주십시오에 대한 Flask.하지 않아야 사용하여 SQL-92 예약어로 관련 이름입니다.
편집:플라스크가 테이블을 작성하'라고 사용하기 때문에 클래스는 사용자.기 위해서는 이를 방지하기 위해,그것은 권장하 제공 __tablename__
옵션을 정의하는 동안 모델이다.
class User(db.Model):
__tablename__= 'MyUser'
....
이 방법은,당신은 피할 수 있습과 충돌하는 기본 규칙의 데이터베이스입니다.