【问题标题】:Flask sqlalchemy - Minimal ApplicationFlask sqlalchemy - 最小应用
【发布时间】:2014-02-26 23:32:11
【问题描述】:

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

【问题讨论】:

  • 您可能应该在某处配置您的数据库连接(实际上,我只是单击了链接,就像在页面中间。app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
  • @njzk2 'postgresql://postgres:xxx@localhost/test',如果我不设置这个conf,显然程序会报错。
  • 不一定。默认的 sqlite 路径效果很好。
  • @njzk2 好的,但问题不在于。我有预期的输出,我只是想了解用户信息存储在哪里。
  • 您的 postgresql 表确实与预期的模式不相似。因此,它存储在其他地方。你确定它不在 sqlite 文件中吗?

标签: python postgresql sqlalchemy flask flask-sqlalchemy


【解决方案1】:

Flask 使用了非常不幸的表名userThis is a reserved keyword in the database;内置 user 函数的别名,该函数又是 current_user 的别名。这就是为什么当你select * from user 时得到列名current_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 保留字作为关系名称。

EDIT:Flask 正在创建一个名为“user”的表,因为类名是 User。为了避免这种情况,建议在定义模型时提供__tablename__ 选项。

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

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

【讨论】:

  • @user2990084 你应该报告一个针对 Flask 的错误。 user 自 SQL-92 以来一直是 SQL 保留字。它不应该使用它。至少,Flask 需要记录这将导致的怪癖。
  • @CraigRinger :错误在于应用程序使用 User 作为类名,知道类名又被用作表名(在库中总是引用,这没有问题)。 (因此在给出的烧瓶示例中。虽然大多数人不会看到这个问题)
  • 理想情况下,应使用__tablename__ = "xyz" 覆盖默认表名以避免此问题。或者,使用与 User 不同的类名
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2015-06-16
  • 2014-04-12
  • 2016-03-15
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多