【问题标题】:Postgres Alter Table relation does not exist [duplicate]Postgres Alter Table关系不存在[重复]
【发布时间】:2015-11-04 08:35:41
【问题描述】:

我有一个名为 Foo 的表,我正在尝试向其中添加一列“bar”。在python中使用psycopg2,我的函数调用是

cursor.execute('ALTER TABLE "Foo" ADD COLUMN bar text')

但是,我收到以下错误:

relation "Foo" does not exist

我还尝试将架构“公开”放在它之前,但无济于事。我究竟做错了什么?谢谢。

编辑:

CraigRinger 的命令 \dt *.?oo 产生了 No matching relations found

\dt *.foo\dt *.Foo 都产生了以下输出:

     List of relations
Schema |Name|Type |Owner
-------+----+-----+--------
public |foo |table|postgres

【问题讨论】:

  • 引用标识符使其区分大小写,您确定您的表实际上没有命名为foo?查看section 4.1.1的最后一段
  • psql\dt *.?oo 的输出是什么?
  • 未找到匹配关系。你是说\dt *.foo 吗?
  • 通过这个命令,我看到了架构public下的表格
  • 您对@CraigRinger 的回答让我感到困惑。他的命令应该返回任何模式中的所有表,以任何字符开头并以'oo'结尾。此外,如果您发出命令\dt *.foo 并且确实看到了一个表格,那么它必须命名为foo 而不是Foo。您能否更新您的问题以包含您提供的 \dt 命令和您获得的完整输出?

标签: python postgresql psycopg2 quoted-identifier


【解决方案1】:

您的表名为foo,而不是Foo。如果您使用引用的名称"Foo",那么 postgres 会将其视为区分大小写,因此不会找到它。

Postgres 将所有未加引号的名称视为小写,即 Foofoo 相同,FOO"foo" 也是如此,但 "Foo" 不一样。

documentation 中明确提到了这一点:

引用标识符也使其区分大小写,而未引用的名称总是折叠为小写。例如,标识符 FOO、foo 和“foo”在 PostgreSQL 中被认为是相同的,但“Foo”和“FOO”与这三个不同并且彼此不同。 (在 PostgreSQL 中将不带引号的名称折叠为小写与 SQL 标准不兼容,SQL 标准说不带引号的名称应折叠为大写。因此,根据标准, foo 应该等效于 "FOO" 而不是 "foo"。如果如果您想编写可移植的应用程序,建议您始终引用特定名称或永远不要引用它。)

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 2015-02-14
    • 2018-11-29
    • 2019-08-02
    • 2020-04-09
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多