2011-05-20 17 views
12

Sólo un ejemplo sencillo: si quiero crear una tabla con auto relleno id en postgres corro este SQL:Doctrine2 doesen't establece la secuencia por defecto para la columna de identidad (postgres)

CREATE SEQUENCE person_id_seq START 1; 

CREATE TABLE person (
    id   integer PRIMARY KEY DEFAULT nextval('person_id_seq'), 
    name  varchar(100) NOT NULL 
); 

y en la doctrina I establecer todas las propiedades

class Person { 

/** 
* @Id 
* @Column(type="integer", nullable=false) 
* @GeneratedValue(strategy="SEQUENCE") 
* @SequenceGenerator(sequenceName="person_id_seq", initialValue=1, allocationSize=100) 
*/ 
private $id; 

pero cuando me genera SQL (PHP ORM de Doctrine: esquema-herramienta: crear --dump-SQL) lo tengo:

CREATE TABLE person (
    id INT NOT NULL, 
    name VARCHAR(100) NOT NULL 
); 
CREATE SEQUENCE person_id_seq INCREMENT BY 100 MINVALUE 1 START 1 

pero no la coloque a los valores de

\ d persona

 Column  |    Type    | Modifiers 
-------------------+--------------------------------+----------- 
id    | integer      | not null 
... 
.. 
. 
+0

Para los recién llegados; existe una nueva PR en github que se relaciona con este problema: https://github.com/doctrine/dbal/pull/669 – edigu

Respuesta

22

Desde el fine manual:

4.8.1. Identifier Generation Strategies
...
AUTO (predeterminado): indica a Doctrine que elija la estrategia preferida por la plataforma de base de datos utilizada. Las estrategias preferidas son IDENTIDAD para MySQL, SQLite y MsSQL y SEQUENCE para Oracle y PostgreSQL. Esta estrategia proporciona una portabilidad completa.
...
IDENTITY: indica a Doctrine que use columnas de identidad especiales en la base de datos que generan un valor en la inserción de una fila. Actualmente, esta estrategia no brinda portabilidad total y es compatible con las siguientes plataformas: MySQL/SQLite (AUTO_INCREMENT), MSSQL (IDENTIDAD) y PostgreSQL (SERIAL).

Ellos sugieren AUTO para la máxima portabilidad:

/** 
* @Id 
* @Column(type="integer", nullable=false) 
* @GeneratedValue 
*/ 

Eso debería crear y cable hasta una secuencia para usted. Una alternativa sería la de pedir una columna serial utilizando la estrategia de IDENTITY:

/** 
* @Id 
* @Column(type="integer", nullable=false) 
* @GeneratedValue(strategy="IDENTITY") 
*/ 

Ésta debe crear su columna id tipo serial y PostgreSQL creará la secuencia y establecer el valor predeterminado para usted.

La documentación indica que lo que está haciendo debería funcionar, pero la documentación generalmente solo proporciona una versión simplificada de la realidad.

Intente utilizar strategy="AUTO". Si eso no funciona, intente strategy="IDENTITY".

4

me encontré con este problema hoy y me encontré con que:

  • trabajo de identidad bueno, ya que utiliza el tipo de serie para PostgreSQL, que crea automáticamente la secuencia relacionada y el valor predeterminado establecido como nextval (secuencia)

  • AUTO crea la tabla y luego la secuencia relacionada, pero no establece el valor predeterminado para la columna de id. Se puede ajustar mediante la adición siguiente código:

    /** 
    * Webpage's ID 
    * 
    * @ORM\Id 
    * @ORM\Column(type="integer", options={"default"="nextval('webpages_id_seq'::regclass)"}) 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 
    

    pero desafortunadamente Doctrina crear la tabla en primer lugar, por lo que necesitamos para cambiar el código SQL creación de mesa y secuencia con el fin de que la secuencia se creará primeros

  • obras SECUENCIA lo mismo que AUTO

Cuestiones relacionadas