首页 文章

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

提问于
浏览
118

我正在尝试运行以下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

7 回答

  • 212

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

  • 3

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

    • 如果您的表名全是小写,例如:您可以使用的帐户: select * from AcCounTs ,它将正常工作

    • 如果您的表名全部小写如下: accounts 以下内容将失败: select * from "AcCounTs"

    • 如果您的表名称是混合大小写,则为: Accounts 以下内容将失败: select * from accounts

    • 如果您的表名称是混合大小写的情况如下: Accounts 以下将正常工作: select * from "Accounts"

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

  • 12

    这真的很有帮助

    SET search_path TO schema,public;
    

    我更多地挖掘了这个问题,并找到了如何通过defoult为当前数据库中的新用户设置这个“search_path” .

    打开DataBase Properties,然后打开Sheet“Variables”,只需为您的用户添加具有实际值的变量 .

    所以现在你的用户将通过defoult得到这个schema_name,你可以使用没有schemaName的tableName .

  • 0

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

    此外,在执行选择时,请指定 your_schema . your_table 像这样:

    select * from my_schema.your_table
    
  • 9

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

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

    从我读过的,这个错误意味着你没有正确引用表名 . 一个常见的原因是该表是使用混合大小写拼写定义的,并且您尝试使用所有小写进行查询 .

    换句话说,以下失败:

    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

  • 0

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

相关问题