我从 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.

由于“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 正在创建一个名为“user”的表,因为类名是 User。为了避免这种情况,建议提供一个 __tablename__ 定义模型时的选项。

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

这样,就可以避免与数据库默认约定的冲突。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top