大家好先发帖在这里所以希望我已经做到了这一点我也是symfony ad postgresql的新手所以也许我做了一个愚蠢的错误:))
我有一个包含地址信息的实体地址。我使用doctrine生成模式:schema:create(Database type Postgresql)
创建表并可在数据库中查看。我需要将信息导入此表,这是从一个开放的街道地图数据库中获取的。所以我试图插入我的实体表。我遇到的问题是我没有传递ID,因为它意味着自动增加,但数据库拒绝我的插入请求,因为id是一个空值。
我是symfony的新手,也是postgresql的新手,所以也许我犯了一个愚蠢的基本错误。我希望有一个人可以帮助我 (另一方面,这个项目最初是在mysql中,并且由于ID是自动增量而工作正常)
以下详细信息:
DD\Bundle\DDGeneratorBundle\Entity\Address:
type: entity
table: address
readOnly: true
repositoryClass: DD\Bundle\DDGeneratorBundle\Repository\AddressRepository
id:
id:
type: integer
generator:
strategy: AUTO
fields:
number:
type: string
length: 255
street:
type: string
length: 255
city:
type: string
length: 255
postcode:
type: string
length: 255
latitude:
type: decimal
scale: 7
longitude:
type: decimal
scale: 7
indexes:
coordinates:
columns: [latitude, longitude]
lifecycleCallbacks: { }
-- Table: address
-- DROP TABLE address;
CREATE TABLE address
(
id integer NOT NULL,
"number" character varying(255) NOT NULL,
street character varying(255) NOT NULL,
city character varying(255) NOT NULL,
postcode character varying(255) NOT NULL,
latitude numeric(10,7) NOT NULL,
longitude numeric(10,7) NOT NULL,
CONSTRAINT address_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE address
OWNER TO postgres;
-- Index: coordinates
-- DROP INDEX coordinates;
CREATE INDEX coordinates
ON address
USING btree
(latitude, longitude);
insert into address ("number",street,city,postcode,latitude,longitude)
select *
from dblink('dbname=osm',
'
SELECT tag_housenumber.v as number,
tag_street.v as street,
tag_city.v as city,
tag_postcode.v as postcode,
ST_Y(ST_Transform(nodes.geom, 4326)) AS latitude,
ST_X(ST_Transform(nodes.geom, 4326)) AS longitude
FROM ways
LEFT JOIN way_tags AS tag_housenumber ON tag_housenumber.way_id = ways.id
LEFT JOIN way_tags AS tag_street ON tag_street.way_id = ways.id
LEFT JOIN way_tags AS tag_city ON tag_city.way_id = ways.id
LEFT JOIN way_tags AS tag_postcode ON tag_postcode.way_id = ways.id
INNER JOIN way_nodes ON ways.id = way_nodes.way_id
INNER JOIN nodes on way_nodes.node_id = nodes.id
WHERE tag_housenumber.k = ''addr:housenumber''
AND tag_street.k = ''addr:street''
AND tag_city.k = ''addr:city''
AND tag_postcode.k = ''addr:postcode'' ')
as t1("number" text,street text,city text,postcode text,latitude numeric(10,7),longitude numeric(10,7));
以下是我从pgadmin3获得的错误,地址详细信息为X'd:
错误:列“id”中的空值违反了非空约束 详细信息:失败的行包含(null,X,XXXXXX,XXXX,XXXX,XXXX,XXXX)。 ****** 错误 ******
错误:列“id”中的空值违反了非空约束 SQL状态:23502 细节:失败的行包含(null,X,XXXXX,XXXXXX,XXXX,XXXX,XXXX)。
答案 0 :(得分:0)
试试这个:
将实体yaml部分更改为:
id:
id:
type: integer
id: true
generator:
strategy: AUTO
答案 1 :(得分:0)
<强>解决方案强>
问题是Symfony没有为id添加自动增量默认值。 Symfony似乎不需要这个,因为它单独请求获取新id所需的序列值。
我修改了我的yaml文件,以便symfony为id字段添加默认值。
显然,对于其他任何想要解决此问题的人,您需要更改默认值中的字符串值,以匹配在symfony中为您的实体生成的序列名称。
DD\Bundle\DDGeneratorBundle\Entity\Address:
type: entity
table: dd_address
readOnly: true
repositoryClass: DD\Bundle\DDGeneratorBundle\Repository\AddressRepository
id:
id:
type: integer
id: true
generator:
strategy: AUTO
options:
default: nextval('dd_address_id_seq')
fields:
number:
type: string
length: 255
street:
type: string
length: 255
city:
type: string
length: 255
postcode:
type: string
length: 255
latitude:
type: decimal
scale: 7
longitude:
type: decimal
scale: 7
indexes:
coordinates:
columns: [latitude, longitude]
lifecycleCallbacks: { }
希望这可以帮助处于相同情况的其他人
亲切的问候 大卫