Flask sqlalchemy - 最小的应用程序

时间:2014-02-26 23:32:12

标签: python postgresql sqlalchemy flask flask-sqlalchemy

我从Flask sqlalchemy开始,但我不明白主页的演示是如何运作的(here)。

这将创建结构:

>>> 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表中没有看到任何管理员或访客。

1 个答案:

答案 0 :(得分:4)

Flask正在使用非常不幸的表名userThis is a reserved keyword in the database;内置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正在创建一个名为“user”的表,因为类名是User。为避免这种情况,建议在定义模型时提供__tablename__选项。

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

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