我有一个现有的PostgreSQL数据库,其中有一个表,创建如下:
CREATE TABLE product (id SERIAL PRIMARY KEY, name VARCHAR(100) DEFAULT NULL)
此表在 Symfony2 项目中的 YML Doctrine2 文件中进行了描述:
AcmeDemoBundleEntityProduct:
type: entity
table: product
fields:
id:
id: true
type: integer
nullable: false
generator:
strategy: SEQUENCE
name:
type: string
length: 100
nullable: true
当我第一次运行原则迁移差异任务时,我应该得到一个版本控制文件,其中没有up
和down
方法中的数据。但我得到的是这个:
// ...
class Version20120807125808 extends AbstractMigration
{
public function up(Schema $schema)
{
// this up() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");
$this->addSql("ALTER TABLE product ALTER id DROP DEFAULT");
}
public function down(Schema $schema)
{
// this down() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");
$this->addSql("CREATE SEQUENCE product_id_seq");
$this->addSql("SELECT setval('product_id_seq', (SELECT MAX(id) FROM product))");
$this->addSql("ALTER TABLE product ALTER id SET DEFAULT nextval('product_id_seq')");
}
}
为什么会检测到差异?我怎样才能避免这种情况?我尝试了几种序列策略,但没有成功。
关于这个问题的一点更新。
使用原则2.4,解决方案是使用IDENTITY
生成器策略:
AcmeDemoBundleEntityProduct:
type: entity
table: product
id:
type: integer
generator:
strategy: IDENTITY
fields:
name:
type: string
length: 100
nullable: true
为了避免在数据库中具有默认值的字段上DROP DEFAULT
,字段上的default
选项是要走的路。当然,这可以通过生命周期回调来完成,但如果其他应用使用此数据库,则必须在数据库中保留默认值。
对于像默认值这样的"DEFAULT NOW()",解决方案如下:
AcmeDemoBundleEntityProduct:
type: entity
table: product
id:
type: integer
generator:
strategy: IDENTITY
fields:
creation_date:
type: datetime
nullable: false
options:
default: CURRENT_TIMESTAMP
> Doctrine 2.0 不支持 SQL DEFAULT 关键字,并且总是会尝试删除 postgres 默认值。
我没有找到解决这个问题的方法,我只是让教义自己处理序列。
这是一个在这里注册的已打开的错误:
http://www.doctrine-project.org/jira/browse/DBAL-903