2015-05-11 4 views
2

Я был вынужден использовать 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 нет автоматического приращения, и мне нужно использовать последовательности. Я обнаружил, что Doctrine автоматически генерирует последовательности, когда я установил @GeneratedValue в auto (по умолчанию). И да, эти последовательности есть.

Вот моя сущность:

<?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 и I`m не используя каких-либо конкретных плагинов базы данных для научения. У вас есть идеи, почему это не должно работать? Я застрял и пытался найти решение в течение нескольких дней.

ответ

6

useris 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 сообщений об этом в сообщении об ошибке. К сожалению, синтаксический анализатор и планировщик на самом деле не имеют достаточной информации в то время, когда ошибка «столбец не существует» генерируется, чтобы знать, что вы изначально писали ключевое слово, все, что он видит, это сканирование функции в этой точке.

+0

Я попытаюсь установить имя таблицы для сущности и пометьте ваш ответ как правильный, если это поможет. Спасибо. – Northys

+0

Спасибо, миллион раз, он работает сейчас. – Northys

Смежные вопросы