Doctrine 列 id 在 PostgreSQL 上不存在
Doctrine column id does not exist on PostgreSQL
我被迫使用 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没有自增功能,必须用sequences。我发现当我将 @GeneratedValue
设置为自动(默认)时,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,我没有使用任何特定于数据库的插件来实现原则。您知道为什么这不起作用吗?我被卡住了并试图找出解决方案好几天了。
user
is a reserved word。它是 current_user
.
的别名
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
如果您想使用 user
作为 table 名称,因为它是一个保留字,您必须 引用标识符 ,例如:
SELECT id FROM "user";
您的 ORM 应该引用所有标识符,或者至少是保留字。不这样做是您的 ORM 中的错误。您可以通过使用非保留字作为 table 名称来解决 ORM 错误。
我认为 psql
中的一个缺点是它会自动引用您传递给反斜杠命令的标识符。所以 \d user
会起作用,但 select * from user
不会。你应该写\d "user"
。区分大小写也会出现同样的问题,其中 \d MyTable
有效但 SELECT * FROM MyTable
无效,您必须编写 SELECT * FROM "MyTable"
.
最好在错误中给出一条关于此的 HINT
消息。不幸的是,解析器和规划器在 "column does not exist" 错误生成时并没有足够的信息来知道您最初写了一个关键字,它看到的只是一个函数扫描。
用特殊字符定义 table 名称,因为有些 table 像用户,postgresql 看起来像系统 table。
而不是“用户”写“user
”。
- @ORM\Table(名称=“用户”)
添加
- @ORM\Table(name="
user
")
我被迫使用 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没有自增功能,必须用sequences。我发现当我将 @GeneratedValue
设置为自动(默认)时,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,我没有使用任何特定于数据库的插件来实现原则。您知道为什么这不起作用吗?我被卡住了并试图找出解决方案好几天了。
user
is a reserved word。它是 current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
如果您想使用 user
作为 table 名称,因为它是一个保留字,您必须 引用标识符 ,例如:
SELECT id FROM "user";
您的 ORM 应该引用所有标识符,或者至少是保留字。不这样做是您的 ORM 中的错误。您可以通过使用非保留字作为 table 名称来解决 ORM 错误。
我认为 psql
中的一个缺点是它会自动引用您传递给反斜杠命令的标识符。所以 \d user
会起作用,但 select * from user
不会。你应该写\d "user"
。区分大小写也会出现同样的问题,其中 \d MyTable
有效但 SELECT * FROM MyTable
无效,您必须编写 SELECT * FROM "MyTable"
.
最好在错误中给出一条关于此的 HINT
消息。不幸的是,解析器和规划器在 "column does not exist" 错误生成时并没有足够的信息来知道您最初写了一个关键字,它看到的只是一个函数扫描。
用特殊字符定义 table 名称,因为有些 table 像用户,postgresql 看起来像系统 table。
而不是“用户”写“user
”。
- @ORM\Table(名称=“用户”) 添加
- @ORM\Table(name="
user
")