我从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
表中没有看到任何管理员或访客。
答案 0 :(得分:4)
Flask正在使用非常不幸的表名user
。 This 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'
....
这样,您可以避免与数据库的默认约定冲突。