我试图运行以下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());

这会产生以下错误:

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

在我能找到的所有例子中,有人得到一个错误,说明关系不存在,这是因为他们在表名中使用大写字母。我的表名没有大写字母。是否有一种方法来查询我的表不包括数据库名称,即showfinder.sf_bands?


当前回答

这真的很有帮助

SET search_path TO schema,public;

我深入研究了这个问题,发现了如何在当前数据库中为新用户默认设置这个“搜索路径”。

打开数据库属性,然后打开表格“变量” 并简单地为您的用户添加该变量的实际值。

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

其他回答

除了Bill Karwin的答案=>

是的,您应该用双引号括起表名。但是,请注意,php很可能不允许你简单地写:

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

相反,您应该像sav所说的那样在包围查询时使用单引号。

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

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

必须用引号写模式名和表名。如下:

select * from "schemaName"."tableName";

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

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

我尝试了所有的好答案(upvote > 10),但都不行。

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

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

找到目标表/方案。 单击鼠标右键,单击:query-tool 在这个新的查询工具窗口中,您可以在不指定set search_path到<SCHEMA_NAME>的情况下运行SQL; 你可以看到结果: