문제

나는 시작으로 플라스크에 정밀한 웹 애플리케이션을 빨리 빌지만,저는 이해하지 못하는 방법을 작품의 데모 홈페이지().

이것은 구조 만들기:

>>> 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'
....

이 방법은,당신은 피할 수 있습과 충돌하는 기본 규칙의 데이터베이스입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top