質問

フラスコSqlalchemyから始めていますが、ホームページのデモのデモ(http://pythonhosted.org/flask-sqlalchemy/quickstart.html#minimal-アプリケーション)の仕組みを理解していません。"rel=" nofollow ">こちら)

構造を作成します:

>>> 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テーブルで管理者またはゲストが表示されないため、

役に立ちましたか?

解決

フラスコは非常に残念なテーブル名userを使用しています。 これは、データベースの予約キーワードです。 userのエイリアスを順に組み込みのcurrent_user関数のエイリアス。 current_userの場合、列名select * from userを取得する理由です。あなたは本当に疑似関数current_userを実行しています。

これは、 "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"
.

はテーブル構造を示します。

フラスコに対するバグを報告してください。リレーション名としてSQL-92予約語を使用してはいけません。

edit :classNameがユーザーのため 'user'というテーブルを作成しています。これを回避するために、モデルを定義しながら__tablename__オプションを提供することをお勧めします。

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

このように、データベースのデフォルトの規則との競合を回避できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top