PostgreSQL上不存在Doctrine列ID

时间:2015-05-11 00:04:08

标签: sql database postgresql doctrine

我被迫使用 PostgreSQL 。我已经阅读了一些有关它的内容,但它仍然是新的,我不知道为什么我会收到此错误:

SQLSTATE[42703]: Undefined column: 7 ERROR: column t0.id does not exist LINE 1: SELECT t0.id AS id1, t0.user AS user2, t0.email AS ma...

我检查了id列存在了数千次(几乎是字面意思)。

我问我的朋友,他告诉我PostgreSQL没有自动增量,我必须使用序列。当我将@GeneratedValue设置为auto(默认值)时,我发现 Doctrine 会自动生成序列。是的,那些序列就在那里。

这是我的实体:

<?php

/**
 * @ORM\Entity
 */
class User
{

    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /** @ORM\Column(type="string", nullable=true) */
    protected $name;

    // some more properties similar to $name

在其他问题(PostgreSQL column 'foo' does not exist)中,他们希望看到\d table的输出。这是它:

northys=# \d user
                         Table "public.user"
  Column  |          Type          |            Modifiers            
----------+------------------------+---------------------------------
 id       | integer                | not null
 name     | character varying(255) | default NULL::character varying
 email    | character varying(255) | not null
 password | character varying(255) | not null
Indexes:
    "user_pkey" PRIMARY KEY, btree (id)
    "uniq_8d93d649e7927c74" UNIQUE, btree (email)
Referenced by:
    TABLE "child" CONSTRAINT "fk_22b3542941807e1d" FOREIGN KEY (teacher_id) REFERENCES "user"(id)
    TABLE "event" CONSTRAINT "fk_3bae0aa7a76ed395" FOREIGN KEY (user_id) REFERENCES "user"(id)

我有 PostgreSQL 9.4.1而且我没有使用任何数据库特定的插件来进行学说。你有什么想法,为什么这不应该工作?我陷入困境,并试图找出解决方案好几天。

2 个答案:

答案 0 :(得分:9)

user is a reserved word。它是current_user的别名。

regress=> SELECT * FROM user;
 current_user 
--------------
 myusername
(1 row)

如果您想使用user作为表名,因为它是一个保留字,您必须引用标识符,例如:

SELECT id FROM "user";

您的ORM应引用所有标识符,或至少保留字。不这样做是您的ORM中的错误。您可以使用非保留字作为表名来解决ORM错误。

我认为在psql中它有点蠢,它会自动引用您传递给反斜杠命令的标识符。因此\d user会有效,但select * from user会赢。你应该写\d "user"。同样的问题出现在区分大小写的情况下,\d MyTable有效但SELECT * FROM MyTable无法正常工作,您必须写SELECT * FROM "MyTable"

很高兴在错误中提供有关此内容的HINT消息。不幸的是,解析器和规划器在&#34;列不存在时确实没有足够的信息&#34;生成错误以便知道您最初编写了一个关键字,它所看到的只是一个函数扫描。

答案 1 :(得分:0)

用特殊字符定义表名,因为像 user、postgresql 这样的一些表被看作是系统表。 代替“用户”写“user”。

  • @ORM\Table(name="user") 添加
  • @ORM\Table(name="user")