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

我试图运行下面的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”不存在

在所有的例子中,我可以find有人得到一个错误,说明关系不存在,这是因为他们在他们的表名中使用大写字母。 我的表名不包含大写字母。 有没有办法查询我的表,而不包括数据库名称,即showfinder.sf_bands

从我读过的,这个错误意味着你没有正确引用表名。 一个常见的原因是该表使用混合大小写拼写来定义,而您正试图用全部小写查询它。

换句话说,下面的失败:

 CREATE TABLE "SF_Bands" ( ... ); SELECT * FROM sf_bands; -- ERROR! 

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

 SELECT * FROM "SF_Bands"; 

重新发表您的评论,您可以将模式添加到“search_path”,以便在您引用表名时不会限定其模式,查询将按照每个模式按顺序匹配该表名。 就像shell中的PATH或PHP中的include_path ,您可以检查当前的模式searchpath:

 SHOW search_path "$user",public 

您可以更改模式searchpath:

 SET search_path TO showfinder,public; 

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

我有这个问题,这是故事(悲伤,但真实):

  1. 如果你的表名都是小写字母,你可以使用: 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参数放入连接string中。 它适用于我,而其他一切都失败了。

另外,在select时,请指定your_schemayour_table像这样:

 select * from my_schema.your_table 

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

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

对我来说,问题是,我已经使用Django初始化时对该特定表的查询。 当然,它会抛出一个错误,因为这些表不存在。 在我的情况下,它是一个get_or_create文件中的get_or_create方法,只要软件运行任何操作(在本例中为迁移),都会执行该方法。 希望能帮助别人。