繁体   English   中英

不能简单地使用 PostgreSQL 表名(“关系不存在”)

[英]Cannot simply use PostgreSQL table name ("relation does not exist")

我正在尝试运行以下 PHP 脚本来执行简单的数据库查询:

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());

$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

这会产生以下错误:

查询失败:错误:关系“sf_bands”不存在

在所有示例中,我都能找到有人收到错误消息,指出关系不存在,这是因为他们在表名中使用了大写字母。 我的表名没有大写字母。 有没有办法在不包括数据库名称的情况下查询我的表,即showfinder.sf_bands

根据我的阅读,此错误意味着您没有正确引用表名。 一个常见的原因是该表是用大小写混合的拼写定义的,而您试图用所有小写字母来查询它。

换句话说,以下失败:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

使用双引号分隔标识符,以便您可以在定义表时使用特定的大小写混合拼写。

SELECT * FROM "SF_Bands";

根据您的评论,您可以将架构添加到“search_path”,这样当您引用表名而不限定其架构时,查询将通过按顺序检查每个架构来匹配该表名。 就像 shell 中的PATH或 PHP 中的include_path等。您可以检查您当前的架构搜索路径:

SHOW search_path
  "$user",public

您可以更改架构搜索路径:

SET search_path TO showfinder,public;

另见http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

我遇到了这个问题,这就是故事(悲伤但真实):

  1. 如果你的表名都是小写的,比如:accounts 你可以使用: select * from AcCounTs ,它会正常工作

  2. 如果您的表名全部小写,例如: accounts以下将失败: select * from "AcCounTs"

  3. 如果您的表名混合大小写,例如: Accounts以下将失败: select * from accounts

  4. 如果您的表名是大小写混合的,例如: Accounts以下将正常工作: select * from "Accounts"

我不喜欢记住这样无用的东西,但你必须;)

Postgres 处理查询不同于其他 RDMS。 将模式名称放在您的表名称之前的双引号中,例如“SCHEMA_NAME”.“SF_Bands”

将 dbname 参数放在连接字符串中。 它对我有用,而其他一切都失败了。

同样在进行选择时,请指定your_schema your_table像这样:

select * from my_schema.your_table

我在 OSX 上遇到了类似的问题,但尝试使用双引号和单引号。 对于你的情况,你可以尝试这样的事情

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"

您必须在引号中写入模式名​​称和表名称。 如下:

select * from "schemaName"."tableName";

如果表名包含下划线或大写,则需要用双引号将其括起来。

SELECT * from "Table_Name";

这真的很有帮助

SET search_path TO schema,public;

我更多地挖掘了这个问题,并发现了如何通过默认为当前数据库中的新用户设置这个“search_path”。

打开数据库属性,然后打开工作表“变量”,只需为您的用户添加具有实际值的变量。

所以现在您的用户将默认获得这个 schema_name,您可以使用 tableName 而不使用 schemaName。

对我来说,问题是,我在 Django 初始化时使用了对该特定表的查询。 当然它会抛出一个错误,因为那些表不存在。 就我而言,它是 admin.py 文件中的get_or_create方法,每当软件运行任何类型的操作(在本例中为迁移)时都会执行该方法。 希望能帮助某人。

我遇到了与上述相同的问题,并且我使用的是 PostgreSQL 10.5。 我尝试了上述所有内容,但似乎没有任何效果。

然后我关闭了 pgadmin 并为 PSQL 终端打开了一个会话。 登录PSQL并分别连接到数据库和模式:

\c <DATABASE_NAME>;
set search_path to <SCHEMA_NAME>;

然后,重新启动 pgadmin 控制台,然后我就可以在 pagadmin 的查询工具中正常工作了。

最简单的解决方法是将表名和所有列名更改为小写,您的问题将得到解决。

例如:

  • Table_Name更改为table_name
  • ColumnName更改为columnname

除了比尔卡文的回答=>

是的,您应该用double quotes将表名double quotes 但是,请注意,很可能 php不允许您简单地编写:

$query = "SELECT * FROM "SF_Bands"";

相反,您应该像sav 所说的那样在查询周围使用single quotes

$query = 'SELECT * FROM "SF_Bands"';

您必须先添加架构,例如

SELECT * FROM place.user_place;

如果您不想在所有查询中添加它,请尝试以下操作:

SET search_path TO place;

现在它将起作用:

SELECT * FROM user_place;

对一些人来说这可能很愚蠢,但在我的情况下 - 一旦我创建了表,我就可以在同一个会话中查询该表,但是如果我使用新的会话table does not exits重新登录table does not exits

然后我在创建表后立即使用commit ,现在我也可以在新会话中查找和查询表。 像这样:

select * from my_schema.my_tbl;

希望这会帮助一些人。

确保表名不包含任何尾随空格

在此处输入图片说明

我尝试了每一个好的答案(upvote > 10)但不起作用。

我在 pgAdmin4 中遇到了这个问题。

所以我的解决方案很简单:

  1. 找到目标表/方案。

  2. 鼠标右键单击,然后单击:查询工具

  3. 在这个新的查询工具 window 中,您可以运行 SQL 而无需set search_path to <SCHEMA_NAME>; 在此处输入图像描述

  4. 你可以看到结果: 在此处输入图像描述

试试这个:SCHEMA_NAME.TABLE_NAME

我建议检查你是否运行迁移或者表是否存在于数据库中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM